使用递增运算符时未定义的行为

时间:2011-07-21 16:41:14

标签: c pre-increment

我是C的新手,我在C

中有一个增量运算符程序
#include<stdio.h>
main(){
  int a, b;
  a = 2;
  b = a + ++a + ++a;
  printf("%d", b);
  getchar();
}

输出为10,有人可以解释一下输出将是10。

2 个答案:

答案 0 :(得分:6)

a + ++a + ++a;

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

答案 1 :(得分:3)

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

函数调用参数也进行了有意义的评估,例如: foo(++i,++i)

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

保证在称为sequence points的地方进行,尽管这个术语在C ++ 0x中已被弃用和澄清。

你的例子中有些奇怪的是,发生了2 + 3 + 4和4 + 4 + 3,因此编译器首先在一步中评估左侧,在另一步中评估右侧。这可能是一种平衡依赖性图表的优化。

相关问题