您的位置:首页 > 其它

关于&& || ! 遇到的一个问题

2017-06-14 20:34 218 查看
新人一枚,刚学到这里哦,很多不足,错误之处,请各位大神们多多指教

一言不合上代码:

int main() {

int x = 10;

int j = (x++ == 2 && x++ == 3 || (x == 10));

printf("%d\n",j);
printf("%d\n", x);

getchar();

return 0;


}

其中x++ == 2 && x++ == 3 || (x == 10)理论上是先执行后面(x == 10),输出的结果,应该是1才对,但打印的结果为0,见图1,下一行的结果就略过吧.



图1


相对完整的反汇编代码如下:

5: int x = 10;

0130178E mov dword ptr [x],0Ah

6:

7: int j = (x++ == 2 && x++ == 3 || (x == 10));

01301795 mov eax,dword ptr [x]

01301798 mov ecx,dword ptr [x]

0130179B add ecx,1

0130179E mov dword ptr [x],ecx

013017A1 cmp eax,2

013017A4 jne main+47h (013017B7h)

013017A6 mov edx,dword ptr [x]

013017A9 mov eax,dword ptr [x]

013017AC add eax,1

013017AF mov dword ptr [x],eax

013017B2 cmp edx,3

013017B5 je main+59h (013017C9h)

013017B7 cmp dword ptr [x],0Ah

013017BB je main+59h (013017C9h)

6:

7: int j = (x++ == 2 && x++ == 3 || (x == 10));

013017BD mov dword ptr [ebp-0DCh],0

013017C7 jmp main+63h (013017D3h)

013017C9 mov dword ptr [ebp-0DCh],1

013017D3 mov ecx,dword ptr [ebp-0DCh]

013017D9 mov dword ptr [j],ecx

8:

9: printf(“%d,%d\n”,x, j);

013017DC mov eax,dword ptr [j]

013017DF push eax

013017E0 mov ecx,dword ptr [x]

013017E3 push ecx

013017E4 push offset string “%d,%d\n” (01306BD0h)

013017E9 call _printf (0130131Bh)

013017EE add esp,0Ch

10:

11: getchar();

013017F1 mov esi,esp

013017F3 call dword ptr [__imp__getchar (0130A164h)]

013017F9 cmp esi,esp

013017FB call __RTC_CheckEsp (01301113h)

汇编出来的意思是:表达式一开始执行的代码如下,虽然 || 后面(x == 10)的优先级最高,但这里的代码却是先执行||之前的x++ == 2 && x++ == 3
int j = (x++ == 2 && x++ == 3 || (x == 10));

01301795 mov eax,dword ptr [x]

01301798 mov ecx,dword ptr [x]

0130179B add ecx,1

0130179E mov dword ptr [x],ecx

013017A1 cmp eax,2

013017A4 jne main+47h (013017B7h)

013017A6 mov edx,dword ptr [x]

013017A9 mov eax,dword ptr [x]

013017AC add eax,1

013017AF mov dword ptr [x],eax

013017B2 cmp edx,3

我又把表达式翻转了一下: x == 10 || (x++ == 2 && x++ == 3),其结果为1,我用java试了也是一样,反复的折腾后,我的结论是: ||之前的表达式或直接写true或false等等,都自动加一个(),相当于((x == 10) || (x++ == 2 && x++ == 3)),我对得出的答案不太满意,无奈于是初学者,以后有满意的答案在来修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐