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

新人一枚,刚学到这里哦,很多不足,错误之处,请各位大神们多多指教

一言不合上代码:

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)),我对得出的答案不太满意,无奈于是初学者,以后有满意的答案在来修改

你可能感兴趣的:(java基础,c基础)