#include <stdio.h>
void main()
{
int x = 0;
if (x = 0)
printf("It's zero\n");
else
printf("It's not zero\n");
}
为什么 if (x = 0)
语句不是错误?我们可以在if
语句中分配类似的值吗?为什么它不产生错误,为什么执行else
语句?
答案 0 :(得分:4)
是的,允许在if
语句中分配值。除其他外,当您要调用该函数并检查是否返回错误时,这非常方便:
int rc;
if ((rc = check())) {
// here rc is non-zero, often an indication of a failure
}
请注意,我是如何在作业周围加上一对括号的-由于这是无处不在的混乱根源,因此编译器通常会在if
块中警告有关分配的警告,假设您可能输入了错字。多余的一对括号使编译器很清楚这就是我的意图。
顺便说一句,这里没有特殊的例外,这种语法的有效性源于一般的C语法-赋值运算符求值为赋值。
答案 1 :(得分:3)
是的,这是一种非常有效的语法,没有理由禁止这样做。
引用C11
,
[...]一个 赋值表达式具有赋值后左操作数的值。 [...]
因此,存储在LHS操作数中的值将用于if
语句条件评估。
在您的情况下,变量x
在赋值后保留值0
,而if (0)
是 FALSY ,这就是else
的原因块被执行。
但是,在大多数情况下,错误地使用了这种语法,而不是进行比较。这就是为什么大多数编译器在此结构上发出警告消息的原因。
警告:建议在分配的括号内用作真值[-括号]
if (x = 0) ^
如果您确定自己在做什么,则可以将if
条件和赋值表达式包装在另一对括号中,这样就很好了。
答案 2 :(得分:2)
在C语言中,对if
语句的唯一要求是它包含一个表达式。语句的真实性基于表达式是否为零。
赋值运算符还会求出赋值,因此if(a = 0)
为假,而if(a = x)
其中x != 0
为真。
由于赋值运算符是表达式,因此可以将其放置在if
语句中,尽管初学者经常犯的错误是在打算使用相等性测试运算符==
的地方使用赋值运算符
可以避免这种错误的一种方法是,如果比较的任一侧都是r值,请将其放在左侧,这样,如果您不小心使用了{{1} },您会收到一个编译错误。比较:
=