有没有办法在if语句中声明变量(仅使用ANSI C)?
示例:
if(int variable = some_function())
{
return 1;
}
有没有办法在if语句中声明变量(仅使用ANSI C)?
示例:
if(int variable = some_function())
{
return 1;
}
if
语句的复合语句(匿名或悬挂块)。请参考此处。 {
int variable;
variable = some_function();
if (variable) return 1;
}
/* variable is out of scope here */
if
的条件调用(无需额外的变量)。if (some_function()) return 1;
来自GCC扩展:
A compound statement enclosed in parentheses may appear as an expression in GNU C. This allows you to use loops, switches, and local variables within an expression. Recall that a compound statement is a sequence of statements surrounded by braces; in this construct, parentheses go around the braces. For example:
({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; })
is a valid (though slightly more complex than necessary) expression for the absolute value of
foo ()
.The last thing in the compound statement should be an expression followed by a semicolon; the value of this subexpression serves as the value of the entire construct. (If you use some other kind of statement last within the braces, the construct has type
void
, and thus effectively no value.)...
简单示例:
#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
IF '(' expression ')' statement
。expression
不能解析为declaration
,因此无法像您的示例中那样在 if 语句中放置一个声明。 - Random Davistype var = value
格式来严格声明变量。 - sjsamif
**(
expression)
statement或**if
**(
expression)
statementelse
statement。 - Keith Thompson