我们可以在if语句中分配一个值吗?

时间:2019-03-01 15:09:54

标签: c if-statement variable-assignment

#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语句?

3 个答案:

答案 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} },您会收到一个编译错误。比较:

=