我是 C 新手,我在 C 中有一个增量运算符程序
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
输出是 10,有人可以解释一下输出是 10 吗?
我是 C 新手,我在 C 中有一个增量运算符程序
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
输出是 10,有人可以解释一下输出是 10 吗?
a + ++a + ++a;
对此的行为是未定义的。编译器可能会生成将其评估为 2 + 4 + 4 或 3 + 3 + 4 的代码,但递增和访问的任何组合/顺序都是“有效”结果。
这是未定义的,++i
可以以任何顺序发生。
函数调用参数也被模棱两可地评估,例如foo(++i,++i)
。
并非所有运算符链都是未定义的,a||b||c
例如,保证是从左到右的。
尽管这个术语在 C++0x 中被弃用和澄清,但这些保证是在称为序列点的地方做出的。
在您的示例中,奇怪的是发生了 2+3+4 和 4+4+3 的情况,因此编译器在一个步骤中首先评估左侧,而在另一个步骤中首先评估右侧。这可能是扁平化依赖图的优化。