为什么编译器会跳过复合语句的某些部分

时间:2014-05-17 21:19:35

标签: c++ pre-increment

例如,在下面的代码中

int x,y,z;
x=y=z=1;
z = ++x && ++y || ++z;
cout<<x<<y<<z;

输出为2 2 1。 我想这是因为编译器知道'++ x&amp;&amp; ++ y'给出'true',因此它跳过剩余的行|| ++z

但是,如果我用下面的代码替换它:

z = ++x && ++y && ++z;

输出仍为2 2 1。 不应该是2 2 2,因为必须评估ANDs'++ x','++ y','++ z'的所有部分。

1 个答案:

答案 0 :(得分:1)

  

我想这是因为编译器知道&#39; ++ x&amp;&amp; ++ý&#39;给出了一个真实的&#39;,所以它跳过剩下的行&#39; || ++ž&#39;

那是对的。它不一定在编译时完成,它可以在更复杂的情况下在运行时执行(因为编译器不能保证知道每个变量中的值。

这不是z == 1的原因。

您正在设置z = ++x && ++y && ++z,它会隐式地将&&生成的布尔值转换为整数。布尔true的整数表示形式为1,因此z == 1