0

我是 C 新手,我在 C 中有一个增量运算符程序

#include<stdio.h>
main(){
  int a, b;
  a = 2;
  b = a + ++a + ++a;
  printf("%d", b);
  getchar();
}

输出是 10,有人可以解释一下输出是 10 吗?

4

2 回答 2

6
a + ++a + ++a;

对此的行为是未定义的。编译器可能会生成将其评估为 2 + 4 + 4 或 3 + 3 + 4 的代码,但递增和访问的任何组合/顺​​序都是“有效”结果。

于 2011-07-21T16:44:43.000 回答
3

这是未定义的,++i可以以任何顺序发生。

函数调用参数也被模棱两可地评估,例如foo(++i,++i)

并非所有运算符链都是未定义的,a||b||c例如,保证是从左到右的。

尽管这个术语在 C++0x 中被弃用和澄清,但这些保证是在称为序列点的地方做出的。

在您的示例中,奇怪的是发生了 2+3+4 和 4+4+3 的情况,因此编译器在一个步骤中首先评估左侧,而在另一个步骤中首先评估右侧。这可能是扁平化依赖图的优化。

于 2011-07-21T16:44:27.600 回答