我是C的新手,我在C
中有一个增量运算符程序#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
输出为10,有人可以解释一下输出将是10。
答案 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,因此编译器首先在一步中评估左侧,在另一步中评估右侧。这可能是一种平衡依赖性图表的优化。