【问题标题】:Why does the compiler skip some parts of a compound statement [duplicate]为什么编译器会跳过复合语句的某些部分[重复]
【发布时间】:2014-07-06 03:22:01
【问题描述】:

例如在下面的代码中

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

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

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

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

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

【问题讨论】:

  • 不,++x &amp;&amp; ++y 仍然为真,因此不会评估 ++z
  • 我真的不明白你的要求?!?请详细说明! ...
  • 我看不出投反对票的原因 - 这是关于意外类型切换的常见错误。
  • 顺便说一句,这是未定义的行为。 (z 在序列点之间被多次修改。)
  • @n00dle 它很常见,以至于它至少有 10384762488575 个单独的答案,并且在 Stack Overflow 周围都有重复。 再问一次也没有意义。

标签: c++ pre-increment


【解决方案1】:

我猜是因为编译器知道 '++x && ++y' 给出了 'true',所以它跳过了剩下的行 '|| ++z'。

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

这不是z == 1 的原因。

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

【讨论】:

  • 可以在编译时完成;这是一个简单的优化,因为 x、y 和 z 是在语句之​​前设置的。而且afaik,它仍然是UB,所以最后z的值是未指定的。
  • 对于这个玩具示例来说,这很公平,我在考虑一般情况。我会添加“必要”:) 它是 UB,但在这种情况下,我的建议不是合乎逻辑的答案吗?
  • 这当然是布尔答案 :) 这可能是解释,但仍然不能依赖它始终有效。 (顺便说一句,这不是我的反对意见。)
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
相关资源
最近更新 更多