可能重复:
C++中编译器和评估的参数顺序
我有一个如下打印声明......
int i=0;
printf("%d,%d,%d,%d,%d,%d",i++,i,++i,i--,++i,i);
Run Code Online (Sandbox Code Playgroud)
根据优先顺序i++,i,++i,i--,++i,i 应该像下面一步一步评估......
0,i,++i,i--,++i,i // after this i=1;
0,i,++i,1,++i,i // after this i=0;
0,i,++i,1,1,i // after this i=1;
0,i,2,1,1,i // after this i=2;
0,2,2,1,1,2 // after this i=2;
Run Code Online (Sandbox Code Playgroud)
最后的结果,我认为从这个逻辑应该是......
0,2,2,1,1,2
Run Code Online (Sandbox Code Playgroud)
但我得到2,2,2,1,2,2 的原因是什么?
顺便说一句,我使用visual c ++ 2010 ...
这是未定义的行为.C和C++语言标准特别指定了函数参数的评估顺序,以便让编译器在各种硬件上生成最优的机器代码.
您不允许在序列点之间多次修改变量.语言标准说序列点只出现在代码中的特定点,例如分隔语句的分号.初始赋值int i=0;后有一个序列点,printf返回后有一个序列点,并且在所有参数之后有一个序列点,printf但是在printf实际调用之前,但是在评估之间没有一个序列点每个论点.
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |