运算符优先问题?

tea*_*her 1 c visual-c++

可能重复:
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 ...

Ada*_*eld 8

这是未定义的行为.C和C++语言标准特别指定了函数参数的评估顺序,以便让编译器在各种硬件上生成最优的机器代码.

您不允许在序列点之间多次修改变量.语言标准说序列点只出现在代码中的特定点,例如分隔语句的分号.初始赋值int i=0;后有一个序列点,printf返回后有一个序列点,并且在所有参数之后有一个序列点,printf但是在printf实际调用之前,但是在评估之间没有一个序列点每个论点.