关于&& || ! 遇到的一个问题
2017-06-14 20:34
218 查看
新人一枚,刚学到这里哦,很多不足,错误之处,请各位大神们多多指教
一言不合上代码:
int main() {
}
其中x++ == 2 && x++ == 3 || (x == 10)理论上是先执行后面(x == 10),输出的结果,应该是1才对,但打印的结果为0,见图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)
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
一言不合上代码:
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 |
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)),我对得出的答案不太满意,无奈于是初学者,以后有满意的答案在来修改 |
相关文章推荐
- 最近遇到一个非常棘手的需求是关于邮件转发的问题,请大家来帮忙给出出主意如何实现。
- 由一个朋友遇到的问题想到的关于程序的架构
- 关于throw runtime_error("IO stream corrupted");的一个问题
- 工作中遇到的一个相当有意思的问题(关于Windows和linux环境下执行PHP,ajax,javascript,flexigrid的一个莫名异常)
- "java.lang.NoClassDefFoundError"错误——一个关于classpath设置的问题
- 遇到一个关于ObjectDataSource的奇怪问题
- 关于XML数据存储时遇到的字符编码的一个怪问题
- 今天遇到一个问题,原来在html的form中如果只有一个type="text"的控件,如果在text中点击回车键,就是自动提交表单!
- 关于数据类型的一个小问题 (int) (int &) (int ) &
- hdu1005&&nyoj-427 一个关于循环节的问题
- 关于加载设计器遇到一个或多个错误问题的解决方案
- 今天在csdn上遇到一个问题,是关于sql数据行列转换的,我的写法如下:
- 今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!
- 一个关于SQL的问题,做做看,好想跟经常遇到的有点不同
- 关于IE6中遇到的select下拉框遇到的一个问题
- 今天看"精通PHP+MySQL应用开发"一个例子遇到的问题
- 面试里经常遇到的一个关于StringBuffer和final的问题
- 关于DLL中遇到的一个问题
- 遇到一个关于静态成员函数的问题
- 关于自己遇到的"Exception starting filter struts2"的问题的解决方案(转)