求高手为我解答C语言的疑问,谢谢

有两个程序:1 int a=-1,b=4,k; k=(a++<=0)&&(!b--<=0);
printf("%d,%d,%d",k,a,b);
答案里的输出结果是1,0,3
我觉得k=(a++<=0)&&(!b--<=0);只是判断的语句,a和b的值应该不会变化,我觉得答案应该是1,-1,4。
2 int a=2,b=3,c=4,d=5; int m=2,n=2;
a=(m=a>b)&&(n=c>d)+5;
printf("%d",n);
答案是 2 但我觉得c>d为假,值为0,赋值给了n,结果应该是0
请高手解答我的疑惑,谢谢了。回答好的话,我还会给你加分

在执行的时候,编译器已经通过运算了,a的地址存放的-1自然被改掉了,(如果再做运算的话,其值不变,例如++(a++),它只做一次自加一运算)。 !的优先级比<=高,--的优先级比!高,b--为3=true,所以!b--为false=0,所以后面部分为真,整句话为真,所以k=1,而a已经变化为1,b=3。
第二题:C里面有一个预编译机制,就是说&&这个操作,如果前面的为false,那么肯定为假,下面的部分它就不看了,自然不做运算,题目中a=0=false,所以后面就不做运算,自然任然时2!。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-02
第一题:先进行增1或减1运算再判断大小,答案没错
第二题:答案也没错,因为a>b为假,所以m=0
当"&&"左边为0时,电脑就不会再算右边了,既n=c>d没有被运算
所以n还是为2。
第2个回答  2008-06-02
00401612 mov edx,dword ptr [a]
00401615 mov eax,dword ptr [a]
00401618 add eax,1
0040161B mov dword ptr [a],eax
0040161E test edx,edx
00401620 jg main+0F1h (00401651)
00401622 mov ecx,dword ptr [b]
00401625 mov edx,dword ptr [b]
00401628 sub edx,1
0040162B mov dword ptr [b],edx
0040162E test ecx,ecx
00401630 jne main+0DBh (0040163b)
00401632 mov dword ptr [ebp-24h],1
00401639 jmp main+0E2h (00401642)
0040163B mov dword ptr [ebp-24h],0
00401642 cmp dword ptr [ebp-24h],0
00401646 jg main+0F1h (00401651)
00401648 mov dword ptr [ebp-28h],1
0040164F jmp main+0F8h (00401658)
00401651 mov dword ptr [ebp-28h],0
00401658 mov eax,dword ptr [ebp-28h]
0040165B mov dword ptr [k],eax

上面是k=(a++<=0)&&(!b--<=0) 的汇编代码,不同的编译器可能会有不同的结果。
前4行是对a进行了加1操作,7到10行是对b进行了减1操作;此时a=0,b=3,!b=0,所以k=1

2、C语言里对逻辑运算进行了优化,对于&&来说,如果第一个操作数为假,就没有必要再运算了
第3个回答  2008-06-02
我用简单易懂的语言来解释吧:
1.因括号运算级最高,先算括号里的。a<0和!b--<=0都成立,故k=1;
然后,a加一,b减一,从而得出结果。
2.因为a>b为假,所以m=0 ,0&& 此时产生短路,即不再计算&&后面的式子,故n未被赋予新值,故仍为2.