#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语句?
发布于 2019-03-01 15:12:09
是的,它允许在if语句中赋值。这非常方便,特别是当您想调用函数并检查它的返回是否出错时:
int rc;
if ((rc = check())) {
// here rc is non-zero, often an indication of a failure
}注意我是如何在我的赋值周围加上一个额外的括号--因为它是一个无所不在的混乱源,所以编译器通常会警告if块中的赋值,假设您可能做了一个错误。额外的括号使编译器清楚地知道这就是我的意图。
顺便说一句,这里没有特殊的异常,这种语法的有效性源于一般的C语法-赋值运算符计算为赋值。
发布于 2019-03-01 15:11:10
是的,这是一个完全有效的语法,没有理由不允许这样做。
引用C11的话,
..。赋值表达式具有赋值后左操作数的值。..。
因此,存储在LHS操作数中的值将用于if语句条件评估。
在您的示例中,变量x在赋值后保存值0,而if (0)是FALSY,这就是执行else块的原因。
然而,在大多数情况下,这种语法使用错误,而不是比较。这就是为什么大多数编译器在这个结构上发出警告消息的原因。
警告:建议将赋值周围的括号用作真值-Wparentheses 如果(x = 0) ^
如果您确定要做什么,可以使用赋值表达式将if条件包装在另一对括号中,这样就更好了。
发布于 2019-03-01 15:18:30
在C语言中,if语句的唯一要求是它包含一个表达式。语句的真实性取决于表达式的计算值是否为零。
赋值运算符也计算为赋值,因此if(a = 0)为false,而if(a = x)为x != 0为真。
由于赋值操作符是一个表达式,所以将其放在if语句中是可以接受的,尽管初学者经常犯的错误是在他们打算使用相等测试操作符==的地方使用赋值操作符。
避免这种错误的一种方法是,如果比较的任何一方都是r值,将其放在左边,这样如果您不小心使用= (您的意思是== ),您将得到一个编译错误。比较:
if(p = NULL) // Valid syntax
...
if(NULL = p) // Syntax error
...https://stackoverflow.com/questions/54947344
复制相似问题