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,一定是我对序列点的理解还有问题,还请神们给予指正。
------解决思路----------------------
那你就应该知道你这写法等价于i++; i=i++;而这是未定义行为。
------解决思路----------------------
居然没看清楚。。结果作废好了
i = i ++ > 0 ? i++: i;
相当于
i = (i ++ > 0 ? i++ : i);
按标准?:的副作用在过?时就结束,结果应该为i=i++。问题是这个式子本身是未定义的(即使按最新的标准,i=++i是已定义的表达式,而后置型的i=i++则仍属于未定义的情况)。
首先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,一定是我对序列点的理解还有问题,还请神们给予指正。
------解决思路----------------------
那你就应该知道你这写法等价于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++则仍属于未定义的情况)。