枫叶007 发表于 2020-2-11 12:02:30

j的值

为什么这段代码在Liunx上编译出的j值是15,在vc2010学习版上面编译的是20,在Dev-C++上面编译的是19#include <stdio.h>

int main()
{
        int i = 1;
        int j = ++i + i++ + ++i + ++i + i++;
        printf("j = %d\n",j);

        return 0;
}

ba21 发表于 2020-2-11 12:06:23

++ -- 在不同的编译器下得到的结果不一定一样。所以++ --不建议混用。
就好比不同的人对同一个事物看法不一定一样的道理。

召唤风云 发表于 2020-2-11 12:07:06

我手算是18,用手机c4droid算出来的也是18。

枫叶007 发表于 2020-2-11 12:10:43

ba21 发表于 2020-2-11 12:06
++ -- 在不同的编译器下得到的结果不一定一样。所以++ --不建议混用。
就好比不同的人对同一个事物看法不 ...

那答案到底是多少呢

枫叶007 发表于 2020-2-11 12:11:37

召唤风云 发表于 2020-2-11 12:07
我手算是18,用手机c4droid算出来的也是18。

我更迷了

ba21 发表于 2020-2-11 12:22:03

枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了值不同,还要怎么说?我说1000你要不要

4goodworld 发表于 2020-2-11 13:22:11

枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

我觉得答案就是你用什么编译器,答案就是什么编译器的结果

4goodworld 发表于 2020-2-11 13:56:47

0040DEE8 C7 45 FC 01 00 00 00 mov         dword ptr ,1       i=1
15:         int j = ++i + i++ + ++i + ++i + i++;
0040DEEF 8B 45 FC             mov         eax,dword ptr
0040DEF2 83 C0 01             add         eax,1                      //eax=1+1
0040DEF5 89 45 FC             mov         dword ptr ,eax      //ebp-4=2
0040DEF8 8B 4D FC             mov         ecx,dword ptr       //ecx=2
0040DEFB 03 4D FC             add         ecx,dword ptr       //ecx=2+2=4   
0040DEFE 8B 55 FC             mov         edx,dword ptr       //edx=2   
0040DF01 83 C2 01             add         edx,1                      //edx=2+1=3
0040DF04 89 55 FC             mov         dword ptr ,edx      //ebp-4=3
0040DF07 03 4D FC             add         ecx,dword ptr        //ecx=4+3=7
0040DF0A 8B 45 FC             mov         eax,dword ptr       //eax=3
0040DF0D 83 C0 01             add         eax,1                      //eax=3+1=4
0040DF10 89 45 FC             mov         dword ptr ,eax      //ebp-4=4
0040DF13 03 4D FC             add         ecx,dword ptr       //ecx=7+4 =11
0040DF16 03 4D FC             add         ecx,dword ptr       //ecx=11+4
0040DF19 89 4D F8             mov         dword ptr ,ecx      //ebp-8=15
0040DF1C 8B 4D FC             mov         ecx,dword ptr
0040DF1F 83 C1 01             add         ecx,1
0040DF22 89 4D FC             mov         dword ptr ,ecx
0040DF25 8B 55 FC             mov         edx,dword ptr
0040DF28 83 C2 01             add         edx,1
0040DF2B 89 55 FC             mov         dword ptr ,edx
16:         printf("j = %d\n",j);
0040DF2E 8B 45 F8             mov         eax,dword ptr
0040DF31 50                   push      eax
0040DF32 68 1C 30 42 00       push      offset string "j = %d\n" (0042301c)
0040DF37 E8 B4 32 FF FF       call      printf (004011f0)
0040DF3C 83 C4 08             add         esp,8
这个是vc6反编译的情况


                int i = 1;
002269F8mov         dword ptr ,1      
                int j = ++i + i++ + ++i + ++i + i++;
002269FFmov         eax,dword ptr    // eax=1
00226A02add         eax,1                   // eax=1+1=2
00226A05mov         dword ptr ,eax   //ebp-8=2
00226A08mov         ecx,dword ptr    //ecx=2
00226A0Badd         ecx,1                   //ecx=2+1=3
00226A0Emov         dword ptr ,ecx   //ebp-8=3
00226A11mov         edx,dword ptr    //edx=3
00226A14add         edx,1                   //edx=3+1=4
00226A17mov         dword ptr ,edx   //ebp-8=4
00226A1Amov         eax,dword ptr    //eax=4
00226A1Dadd         eax,dword ptr    //eax=4+4=8
00226A20add         eax,dword ptr    //eax=8+4=12
00226A23add         eax,dword ptr    //eax=12+4=16
00226A26add         eax,dword ptr    //eax=16+4=20
00226A29mov         dword ptr ,eax// ebp-14=20
00226A2Cmov         ecx,dword ptr
00226A2Fadd         ecx,1
00226A32mov         dword ptr ,ecx
00226A35mov         edx,dword ptr
00226A38add         edx,1
00226A3Bmov         dword ptr ,edx
                printf("j = %d\n", j);
00226A3Emov         eax,dword ptr
                printf("j = %d\n", j);
00226A41push      eax
00226A42push      228FF0h
00226A47call      00221050
00226A4Cadd         esp,8
这个是vs2017反编译的计算结果
综上,我觉得这个是编译器的问题,你问哪个才是结果,我个人觉得vc6是我们理解的那种

人造人 发表于 2020-2-11 13:57:15

枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了吗,这类问题没有正确答案
页: [1]
查看完整版本: j的值