int i = 一;i = i ++ > 0 ? i++: i; 为什么i等于2而不是3

int i = 1;i = i ++ > 0 ? i++: i; 为什么i等于2而不是3?
    首先i先做判断 1  > 0,结果为true,然后遇到序列点?i做自增,并选择i++的分支执行,这时i = 2 并作赋值给i,然后遇到序列点;i再自增,那也应该是3啊
   贴上vs2013的反汇编代码:
int i = 1;
0126139E  mov         dword ptr [i],1  
i = i++ > 0 ? i++ : i;
012613A5  mov         eax,dword ptr [i]  
012613A8  mov         dword ptr [ebp-0D0h],eax  
012613AE  mov         ecx,dword ptr [i]  
012613B1  add         ecx,1  
012613B4  mov         dword ptr [i],ecx  
012613B7  cmp         dword ptr [ebp-0D0h],0  
012613BE  jle         main+54h (012613D4h)  
012613C0  mov         edx,dword ptr [i]  
012613C3  mov         dword ptr [ebp-0D4h],edx  
012613C9  mov         eax,dword ptr [i]  
012613CC  add         eax,1  
012613CF  mov         dword ptr [i],eax  
012613D2  jmp         main+5Dh (012613DDh)  
012613D4  mov         ecx,dword ptr [i]  
012613D7  mov         dword ptr [ebp-0D4h],ecx  
012613DD  mov         edx,dword ptr [ebp-0D4h]  
012613E3  mov         dword ptr [i],edx  

如果第二步是   i ++ > 0 ? i++ : i;
汇编代码为上述的除去后五行,

 看了反汇编的代码,也知道汇编代码怎么是2了,但是按照我现有的理解(上边的理解)应该就是3的,怎么生成的汇编代码为什么是2,一定是我对序列点的理解还有问题,还请神们给予指正。


------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

>这时i = 2 并作赋值给i,然后遇到序列点;i再自增
这里没有序列点

五点58,蛮拼的
分号不是序列点?

分号是分整个statement的,不是分?:的。分号序列点发生在整个i = i++ > 0 ? i++ : i之后。

这个我知道啊,先赋值嘛,之后不是应该还自增的

那你就应该知道你这写法等价于i++; i=i++;而这是未定义行为。
------解决思路----------------------
引用:
其实这问题全出在i=i++>0上
这个式子其实是
i=(i++>0)
i++>0为true,所以相当于i=true
结果i=1,然后才是执行问号后面的内容

居然没看清楚。。结果作废好了
i = i ++ > 0 ? i++: i;
相当于
i = (i ++ > 0 ? i++ : i);
按标准?:的副作用在过?时就结束,结果应该为i=i++。问题是这个式子本身是未定义的(即使按最新的标准,i=++i是已定义的表达式,而后置型的i=i++则仍属于未定义的情况)。