使用增量运算符时未定义的行为
我是 C 新手,我在 C 中有一个增量运算符程序,
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
输出为 10,有人可以解释一下输出如何为 10 。
I am new to C, i have an Increment operator program in C
#include<stdio.h>
main(){
int a, b;
a = 2;
b = a + ++a + ++a;
printf("%d", b);
getchar();
}
The output is 10, can someone explain me how the output will be 10 .
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
此行为未定义。
编译器可能会生成将其计算为 2 + 4 + 4 或 3 + 3 + 4 的代码,但递增和访问的任何组合/顺序都是“有效”结果。
Behaviour for this is undefined.
The compiler might generated code that evaluated this as 2 + 4 + 4 or 3 + 3 + 4, but any combination/ordering of incrementing and accessing is a "valid" result.
这是未定义的,
++i
可以按任何顺序发生。函数调用参数的计算也会不明确,例如
foo(++i,++i)
。并非所有运算符链都是未定义的,例如,
a||b||c
保证是从左到右的。这些保证是在称为 序列点 的地方进行的,尽管该术语在 C+ 中已被弃用并得到澄清+0x。
您的示例中奇怪的是,发生了相邻的 2+3+4 或 4+4+3,因此编译器在一个步骤中首先评估左侧,在另一个步骤中首先评估右侧。这可能是为了扁平化依赖图而进行的优化。
This is undefined, the
++i
can happen in any order.Function call arguments are also ambigiously evaluated, e.g.
foo(++i,++i)
.Not all operator chains are undefined,
a||b||c
is guaranteed to be left-to-right, for example.The guarantees are made in places known as sequence points although this terminology is being deprecated and clarified in C++0x.
What's odd in your example is that neigher 2+3+4 nor 4+4+3 happened, so the compiler evaluated the left side first in one step and the right side first in the other. This was probably an optimisation to flatten the depencency graph.