鱼C论坛

 找回密码
 立即注册
查看: 2809|回复: 5

【小菜】关于&&和||运算的问题!

[复制链接]
发表于 2012-5-21 19:19:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
说起来惭愧现在才去报了个二级考....... 拿起C开始霹雳巴拉做起来 不做不知道  一做吓一跳...被几道基础的题目给郁闷到而来  
     【题目】:int x,y,z;
x=0;y=0;z=0;
++x||++y&&++z;
printf("%d%d%d\n",x,y,z);这样xyz的值分别为 1 0 0
一开始我做的时候 我的答案是0 1 1 应为呢 在这两个逻辑运算符中&&的优先级别要高于 || 因此我就认为是 0 1 1;(其实我现在还怀疑是不是书本错了.......)哎.....谁能告诉我为什么这里就执行了++x呢  ||的优先级别低为什么还 是先算了||呢?.?
第二道
x=-1;y=-1;z=-1;
++x&&++y&&++z;
printf("%d%d%d\n",x,y,z);答案是 0 -1 -1 我做的是0 0 -1 这题就更是觉得离谱了 肿么是这样呢&&两边为真她才为真 这里也只运算了++x而已后面++y不运行?
第三道  值同上  都为-1;(大哥偷下懒莫怪)
x++&&--y&&z--||--x;
输出同上;答案是0 -2 -2 ;  这些看似很菜的问题 真是弄的一阵头大 ...请知道的大哥赐教!
跪谢!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-5-21 21:31:54 | 显示全部楼层
4:        int x,y,z;
5:        x=0,y=0,z=0;
00401028   mov         dword ptr [ebp-4],0
0040102F   mov         dword ptr [ebp-8],0
00401036   mov         dword ptr [ebp-0Ch],0
6:        ++x||++y&&++z;
0040103D   mov         eax,dword ptr [ebp-4]
00401040   add         eax,1
00401043   mov         dword ptr [ebp-4],eax
00401046   cmp         dword ptr [ebp-4],0
0040104A   jne         main+54h (00401064)
0040104C   mov         ecx,dword ptr [ebp-8]
0040104F   add         ecx,1
00401052   mov         dword ptr [ebp-8],ecx
00401055   cmp         dword ptr [ebp-8],0
00401059   je          main+54h (00401064)
0040105B   mov         edx,dword ptr [ebp-0Ch]
0040105E   add         edx,1
00401061   mov         dword ptr [ebp-0Ch],edx
7:        printf("%d%d%d\n",x,y,z);
00401064   mov         eax,dword ptr [ebp-0Ch]
00401067   push        eax
00401068   mov         ecx,dword ptr [ebp-8]
0040106B   push        ecx
0040106C   mov         edx,dword ptr [ebp-4]
0040106F   push        edx
00401070   push        offset string "%d%d%d\n" (0042201c)
00401075   call        printf (004010b0)
0040107A   add         esp,10h

上面是反汇编的结果,因为自增的优先级高,并且是自左到右的,所以编译器先运行++x,那么此时x的值为1,而C的编译器在运行或运算时,只要有1个值为真,那么后面的都认为为真,并且不运行后面的值,所以导致了++y和++z没没运行就跳转到 printf("%d%d%d\n",x,y,z);了,具体的汇编语言是
00401055   cmp         dword ptr [ebp-8],0
00401059   je          main+54h (00401064)

这是第一小题的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-5-21 21:33:25 | 显示全部楼层
第二跟第三小道跟第一道的思路相同,只要&&左边的值为0(即为假)那么编译器就跳过,而不运行&&右边的
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-5-21 21:46:57 | 显示全部楼层

Thank you very much 。有点明白了   但是即使++的优先级别很高但是 &&的优先级别也要比||的高一些而参与运算的时候 为什么是自增了1 然后进行了||呢    按照优先级别 还是因该先 &&然后||    我查看课本 课本&&优先级5  而||是4   
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-5-21 23:10:41 | 显示全部楼层
Crazy迷恋 发表于 2012-5-21 21:46
Thank you very much 。有点明白了   但是即使++的优先级别很高但是 &&的优先级别也要比||的高一些而参与 ...

拿第一题来说吧,++x||++y&&++z,因为&&的优先级高于||,所以++x||++y&&++z相当于(++x)||(++y&&++z),但由于||是左结合性,所以先算左边,因为++x为真,所以编译器不计算右边而直接跳过了
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-5-23 12:10:59 | 显示全部楼层
Yara 发表于 2012-5-21 23:10
拿第一题来说吧,++x||++y&&++z,因为&&的优先级高于||,所以++x||++y&&++z相当于(++x)||(++y&&++z),但由 ...

谢谢 大哥懂了  
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-13 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表