鱼C论坛

 找回密码
 立即注册
查看: 4615|回复: 7

大虾进来帮下小白回答下

[复制链接]
发表于 2013-2-15 20:04:48 | 显示全部楼层 |阅读模式
9鱼币
#include <stdio.h>
main()
{
        int a=-2, b=0;
        while( a++ && ++b )
                ;
        printf("%d %d", a, b);
}

答案是输出    a==1    b==2

a循环从 -2自加到0时,b循不从0自加到2       下次循环  因为是 假    退出了循环         在  0++&&++2  判断时,a是后置没有加到, 但++b   陔自加1   等于3才对         

如果答案是  a==0     b==2    或  a==1    b==3       我倒想的通

但我想不明白    a 是后置,都自加三次     b的是前置,怎反比后置的  少自加一次   



最佳答案

查看完整内容

从这段反汇编代码看来可以知道,首先把a的值放在 [ebp-0DCh]的地方,然后a的值加1,然后再拿ptr [ebp-0DCh]的值与0比较,再对b的值进行加1,,,,,,注意,如果这时候ptr [ebp-0DCh]的值等于0,那么b不会自加,退出循环,所以...我简单的表述下: 第一次: a=-2 ,a的值加1,a=-1,拿-2和0比较,不相等,没有跳;b的值加1,b=1,不等于0,执行循环体 第二次: a=-1 ,a的值加1,a=0,拿-1和0比较,不相等,没有跳;b的值加1,b=2,不等于0,执行循环体 第三次: a= ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-15 20:04:49 | 显示全部楼层
  1.         int a=-2, b=0;
  2. 00CE13CE  mov         dword ptr [a],0FFFFFFFEh  
  3. 00CE13D5  mov         dword ptr [b],0  
  4.         while( a++ && ++b )
  5. 00CE13DC  mov         eax,dword ptr [a]  
  6. 00CE13DF  mov         dword ptr [ebp-0DCh],eax  
  7. 00CE13E5  mov         ecx,dword ptr [a]  
  8. 00CE13E8  add         ecx,1  
  9. 00CE13EB  mov         dword ptr [a],ecx  
  10. 00CE13EE  cmp         dword ptr [ebp-0DCh],0  
  11. 00CE13F5  je          main+54h (0CE1404h)  
  12. 00CE13F7  mov         eax,dword ptr [b]  
  13. 00CE13FA  add         eax,1  
  14. 00CE13FD  mov         dword ptr [b],eax  
  15. 00CE1400  je          main+54h (0CE1404h)  
  16.                 ;
  17. 00CE1402  jmp         main+2Ch (0CE13DCh)  
  18.         printf("%d %d", a, b);
复制代码
从这段反汇编代码看来可以知道,首先把a的值放在 [ebp-0DCh]的地方,然后a的值加1,然后再拿ptr [ebp-0DCh]的值与0比较,再对b的值进行加1,,,,,,注意,如果这时候ptr [ebp-0DCh]的值等于0,那么b不会自加,退出循环,所以...我简单的表述下:
第一次: a=-2 ,a的值加1,a=-1,拿-2和0比较,不相等,没有跳;b的值加1,b=1,不等于0,执行循环体
第二次: a=-1 ,a的值加1,a=0,拿-1和0比较,不相等,没有跳;b的值加1,b=2,不等于0,执行循环体
第三次: a=0,a的值加1,a=1,拿0和0比较,  相等  ,  跳到输出语句 ;b的值 不会 再加1了;

所以a=1;b=2;
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-15 23:36:01 | 显示全部楼层
话说while( a++ && ++b ) 括号里的什么意思啊什么a++且++b 什么情况啊
是a++==0还是什么意思啊??   我想说的是&&的书啊 如果左边为假右边就不执行 不知道对你 有没有帮助  我是菜鸟所以你那句代码 我看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 00:28:18 | 显示全部楼层
顺便说下 我是 高一学生 我QQ1029127115 大家可以一起努力
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 07:45:39 | 显示全部楼层
&&有短路属性,就是说对于a++&&++b,当a++为假时不执行++b操作
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 09:43:28 | 显示全部楼层
5楼正解。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-16 19:34:42 | 显示全部楼层
版主正解,另外||也同时具有短路属性
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-17 01:26:14 | 显示全部楼层
&&:逻辑与,有0则为0
0&&0 = 0
1&&0 = 0
0&&1 = 0
1&&1 = 1

a == 0 && b== 2
如果a为0,则上述表达式的值为0,这时不进行b的运算;只有当a的值为非0时,才进行b的运算。
满足 0&&1 = 0 当while为0的时候就退出循环体
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-8 07:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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