飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7293|回复: 13

[C/C++] 关于一个变量自加运算中出现的问题

[复制链接]

该用户从未签到

发表于 2009-5-9 02:38:44 | 显示全部楼层 |阅读模式
main( )
{
    int i=3,k;
    k = (((++i)+(++i))+(++i));
    printf("%d\n",k);
}

这个东西 在Turboc和VC6的执行结果是不一样的

VC6 中是这样的 : 5+5+6 = 16

00401159  |.  C745 FC 03000>MOV DWORD PTR SS:[EBP-4],3               ;  [EBP-4] 就是K
00401160  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00401163  |.  83C0 01       ADD EAX,1                                ;  3+1
00401166  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  4
00401169  |.  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]
0040116C  |.  83C1 01       ADD ECX,1                                ;  4+1
0040116F  |.  894D FC       MOV DWORD PTR SS:[EBP-4],ECX             ;  5   此时 [EBP-4]=5
00401172  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00401175  |.  0355 FC       ADD EDX,DWORD PTR SS:[EBP-4]             ;  5+5
00401178  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0040117B  |.  83C0 01       ADD EAX,1
0040117E  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  10+6


turboc 2.0 中是这样的:6+6+6 = 18

seg000:01BE                 mov     si, 3           ; si = k =3
seg000:01C1                 inc     si
seg000:01C2                 inc     si
seg000:01C3                 inc     si
seg000:01C4                 mov     di, si          ; si = k = 6
seg000:01C6                 add     di, si
seg000:01C8                 add     di, si
seg000:01CA                 push    di
seg000:01CB                 push    ds
seg000:01CC                 mov     ax, 94h ; '?
seg000:01CF                 push    ax              ; format
seg000:01D0                 call    _printf

在处理自增运算时 尽量避免在一行指令中对同一变量进行自加运算 否则你将会很麻烦 不行你猜下面这行代码结果是多少:

main( )
{
    int i=3,k;
    k = ++i+i+++i+i ;
    printf("%d\n",k);
}


昨天群里边问道的一个问题  C语言中的问题大家直接在本版块提问即可
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-29 07:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-5-9 08:32:27 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 11:02:51 | 显示全部楼层
    在谭浩强的书中有这么一段

    sshot-1.gif

    所以我们还是避免去写这样的程序吧,编译器有区别
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 12:11:26 | 显示全部楼层
    /:L
    支持下
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 12:12:43 | 显示全部楼层
    ++i 和 i++ 一直有点混乱。。每次看清楚了 再去做 也还有点。。。这次也要好好搞清楚
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 12:31:03 | 显示全部楼层
    是挺混乱的~~~哈哈·~~谢谢大虾们的提醒·~哈哈·
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-4-18 15:36
  • 签到天数: 207 天

    [LV.7]常住居民III

    发表于 2009-5-9 12:42:49 | 显示全部楼层
    讲得很明白了,感谢!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-9 12:47:54 | 显示全部楼层
    刚才在群里理清了一题。。。呵呵!/:001
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-10 10:45:07 | 显示全部楼层
    感觉unpack的回答的最好,
    这东西主要是跟各个编译器的自定义有关系。以前也见到过参数入栈顺序也有这种问题
    所以编译的时候要注意自己所用的编译器的厂家
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-10 15:03:58 | 显示全部楼层
    00401026  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
    00401028  |.  C745 FC 03000>MOV DWORD PTR SS:[EBP-4],3               ;  i=3,变量的初始化
    0040102F  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  eax=3
    00401032  |.  83C0 01       ADD EAX,1                                ;  eax+1==4
    00401035  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  4放入EBP-4这个地址中
    00401038  |.  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]             ;  ecx==4
    0040103B  |.  83C1 01       ADD ECX,1                                ;  ecx+1==5
    0040103E  |.  894D FC       MOV DWORD PTR SS:[EBP-4],ECX             ;  ecx==5放入EBP-4这个地址
    00401041  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]             ;  edx==5
    00401044  |.  0355 FC       ADD EDX,DWORD PTR SS:[EBP-4]             ;  edx==5+5==10
    00401047  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  eax==5
    0040104A  |.  83C0 01       ADD EAX,1                                ;  eax+1==6
    0040104D  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  eax==6放入EBP-4这个地址
    00401050  |.  0355 FC       ADD EDX,DWORD PTR SS:[EBP-4]             ;  edx==10+6[EBP-4这个地址的值]
    00401053  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX

    想知道为什么是5+5,而不是4+5
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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