繁体   English   中英

'if' 语句中的赋值和比较顺序

[英]Order of assignment and comparison in an 'if' statement

看代码:

int i = 5;
if (i = 0)
{
  printf ("Got here\n");
}

C 标准对要打印的内容有什么规定? 或者更一般地说,分配是先发生还是比较?

§6.8.4 说if选择语句的语法是:

if ( expression ) 

在本节中,它提到如果表达式比较不等于 0,则执行statement 因此,必须先计算表达式,然后才能将其与 0 进行比较i = 0是计算结果为 0 的表达式。有关进一步的参考,请参阅第 6.5.16 节“赋值运算符”的第 6.5 节“表达式”,特别注意这段摘录:

赋值运算符将值存储在左操作数指定的对象中。 赋值表达式在赋值后具有左操作数的值,但不是左值。

首先分配作业,因为它是评估的一部分。 赋值表达式返回分配的值,因此表达式的计算结果为 false。

i=0评估为 0,因此不会发生输出。

先前的分配(源代码的第一行)与结果无关。

语句i = 0将被评估并返回0 ,因此不会打印该语句。

分配发生的时间无关紧要。 相关的是i=0作为表达式的值,它被定义为值为 0。

赋值发生了,它返回一个 0,它是假的。

先计算 if 子句的表达式,结果为 0。

这个程序永远不会打印“Got here\n”。

正如其他人已经说过的那样,赋值返回被赋值的值,因此从不打印语句。 如果您希望打印该语句,则必须使用if (i = -1)

什么都不会打印。 将 0 分配给 i ,然后对该值进行条件测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM