【发布时间】:2014-11-29 14:46:00
【问题描述】:
#include<stdio.h>
int main()
{
int a = 10;
printf("%d %d %d",++a,a++,a--);
return 0;
}
我稍微编辑了代码..现在输出是:11 9 10 现在更复杂了..
【问题讨论】:
-
你认为为什么会这样?什么不清楚?
-
解释:未定义的行为
#include<stdio.h>
int main()
{
int a = 10;
printf("%d %d %d",++a,a++,a--);
return 0;
}
我稍微编辑了代码..现在输出是:11 9 10 现在更复杂了..
【问题讨论】:
取决于编译器评估函数调用参数的顺序。
如果编译器从左到右(这将解释您的输出):
但是如果我编译这个,例如使用另一个编译器,我可以获得不同的输出。
【讨论】:
改写如下可能更容易理解:
注意:我假设编译器会生成代码来从左到右评估参数!这可能是特定于编译器的。
#include<stdio.h>
int main()
{
int a = 10;
int param2, param3, param4;
param2 = ++a; // increments a to 11 and evaluates to 11
param3 = a--; // evaluates to current value of a then decrements a (11)
param4 = a++; // evaluates to current value of a then increments a (10)
printf("%d %d %d",param2,param3,param4);
return 0;
}
【讨论】:
increment(++)和decrement(--)操作符的位置很重要。因此,在 ++a 的情况下,值从 10 增加到 11,然后打印,对于 a-- 打印当前值,即 10,然后将 a 递增到 11。类似地,在最后一种情况下,打印 a++ 当前值 11 并且它增加到 12。
【讨论】: