有没有办法在***if语句***中声明变量(仅限***ANSI C***)?
示例:
if(int variable = some_function()) { return 1; }
rekjcdws1#
不你不能这么做您可以为if创建一个复合语句(anonymous 或 hanging 块
if
{ int variable; variable = some_function(); if (variable) return 1; } /* variable is out of scope here */
注意,对于这种简单的情况,您可以调用函数作为if的条件(不需要额外的变量)。
if (some_function()) return 1;
pepwfjgg2#
从GCC extension开始:括号中的复合语句在GNU C中可以作为表达式出现。这允许您在表达式中使用循环,开关和局部变量。回想一下,复合语句是由大括号包围的语句序列;在这个结构中,圆括号围绕着大括号。例如:
({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; })
是foo ()绝对值的有效表达式(尽管比必要的稍微复杂一些)。
foo ()
复合语句中的最后一件事应该是一个表达式,后面跟着一个分号;这个子表达式的值作为整个构造的值。(如果你在大括号中最后使用其他类型的语句,则该构造的类型为void,因此实际上没有值。
void
简化示例:
#include <stdio.h> int main() { if (({int a = 1; a;})) printf("Hello World: TRUE"); else printf("Hello World: FALSE"); return 0; } // output: // Hello World: TRUE #include <stdio.h> int main() { if (({int a = 0; a;})) printf("Hello World: TRUE"); else printf("Hello World: FALSE"); return 0; } // output: // Hello World: FALSE
真的有人这样使用它吗?是的!据我所知,Linux内核通过这个扩展简化了代码。
/* SPDX-License-Identifier: GPL-2.0-only */ #define __get_user(x, ptr) \ ({ \ int __gu_err = 0; \ __get_user_error((x), (ptr), __gu_err); \ __gu_err; \ }) #define unsafe_op_wrap(op, err) do { if (unlikely(op)) goto err; } while (0) #define unsafe_get_user(x,p,e) unsafe_op_wrap(__get_user(x,p),e)
https://elixir.bootlin.com/linux/latest/source/include/linux/uaccess.h#L365
2条答案
按热度按时间rekjcdws1#
不你不能这么做
您可以为
if
创建一个复合语句(anonymous 或 hanging 块注意,对于这种简单的情况,您可以调用函数作为
if
的条件(不需要额外的变量)。pepwfjgg2#
从GCC extension开始:
括号中的复合语句在GNU C中可以作为表达式出现。这允许您在表达式中使用循环,开关和局部变量。回想一下,复合语句是由大括号包围的语句序列;在这个结构中,圆括号围绕着大括号。例如:
是
foo ()
绝对值的有效表达式(尽管比必要的稍微复杂一些)。复合语句中的最后一件事应该是一个表达式,后面跟着一个分号;这个子表达式的值作为整个构造的值。(如果你在大括号中最后使用其他类型的语句,则该构造的类型为
void
,因此实际上没有值。简化示例:
真的有人这样使用它吗?是的!据我所知,Linux内核通过这个扩展简化了代码。
https://elixir.bootlin.com/linux/latest/source/include/linux/uaccess.h#L365