鱼C论坛

 找回密码
 立即注册
查看: 1382|回复: 8

[已解决]j的值

[复制链接]
发表于 2020-2-11 12:02:30 | 显示全部楼层 |阅读模式

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

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

x
为什么这段代码在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;
}
QQ图片20200211115959.jpg
最佳答案
2020-2-11 12:22:03
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了值不同,还要怎么说?我说1000你要不要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-11 12:06:23 | 显示全部楼层
++ -- 在不同的编译器下得到的结果不一定一样。所以++ --不建议混用。
就好比不同的人对同一个事物看法不一定一样的道理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-11 12:07:06 From FishC Mobile | 显示全部楼层
我手算是18,用手机c4droid算出来的也是18。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那答案到底是多少呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-11 12:11:37 | 显示全部楼层
召唤风云 发表于 2020-2-11 12:07
我手算是18,用手机c4droid算出来的也是18。

我更迷了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 12:22:03 | 显示全部楼层    本楼为最佳答案   
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了值不同,还要怎么说?我说1000你要不要
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 13:22:11 | 显示全部楼层
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

我觉得答案就是你用什么编译器,答案就是什么编译器的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-11 13:56:47 | 显示全部楼层
0040DEE8 C7 45 FC 01 00 00 00 mov         dword ptr [ebp-4],1       i=1
15:           int j = ++i + i++ + ++i + ++i + i++;
0040DEEF 8B 45 FC             mov         eax,dword ptr [ebp-4] 
0040DEF2 83 C0 01             add         eax,1                      //eax=1+1
0040DEF5 89 45 FC             mov         dword ptr [ebp-4],eax      //ebp-4=2
0040DEF8 8B 4D FC             mov         ecx,dword ptr [ebp-4]      //ecx=2
0040DEFB 03 4D FC             add         ecx,dword ptr [ebp-4]      //ecx=2+2=4   
0040DEFE 8B 55 FC             mov         edx,dword ptr [ebp-4]      //edx=2   
0040DF01 83 C2 01             add         edx,1                      //edx=2+1=3
0040DF04 89 55 FC             mov         dword ptr [ebp-4],edx      //ebp-4=3
0040DF07 03 4D FC             add         ecx,dword ptr [ebp-4]          //ecx=4+3=7
0040DF0A 8B 45 FC             mov         eax,dword ptr [ebp-4]      //eax=3  
0040DF0D 83 C0 01             add         eax,1                      //eax=3+1=4
0040DF10 89 45 FC             mov         dword ptr [ebp-4],eax      //ebp-4=4
0040DF13 03 4D FC             add         ecx,dword ptr [ebp-4]      //ecx=7+4 =11
0040DF16 03 4D FC             add         ecx,dword ptr [ebp-4]      //ecx=11+4
0040DF19 89 4D F8             mov         dword ptr [ebp-8],ecx      //ebp-8=15
0040DF1C 8B 4D FC             mov         ecx,dword ptr [ebp-4]
0040DF1F 83 C1 01             add         ecx,1
0040DF22 89 4D FC             mov         dword ptr [ebp-4],ecx
0040DF25 8B 55 FC             mov         edx,dword ptr [ebp-4]
0040DF28 83 C2 01             add         edx,1
0040DF2B 89 55 FC             mov         dword ptr [ebp-4],edx
16:           printf("j = %d\n",j);
0040DF2E 8B 45 F8             mov         eax,dword ptr [ebp-8]
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;
002269F8  mov         dword ptr [ebp-8],1       
                int j = ++i + i++ + ++i + ++i + i++;
002269FF  mov         eax,dword ptr [ebp-8]   // eax=1
00226A02  add         eax,1                   // eax=1+1=2
00226A05  mov         dword ptr [ebp-8],eax   //ebp-8=2
00226A08  mov         ecx,dword ptr [ebp-8]   //ecx=2
00226A0B  add         ecx,1                   //ecx=2+1=3
00226A0E  mov         dword ptr [ebp-8],ecx   //ebp-8=3
00226A11  mov         edx,dword ptr [ebp-8]   //edx=3
00226A14  add         edx,1                   //edx=3+1=4
00226A17  mov         dword ptr [ebp-8],edx   //ebp-8=4
00226A1A  mov         eax,dword ptr [ebp-8]   //eax=4
00226A1D  add         eax,dword ptr [ebp-8]   //eax=4+4=8
00226A20  add         eax,dword ptr [ebp-8]   //eax=8+4=12
00226A23  add         eax,dword ptr [ebp-8]   //eax=12+4=16
00226A26  add         eax,dword ptr [ebp-8]   //eax=16+4=20
00226A29  mov         dword ptr [ebp-14h],eax  // ebp-14=20
00226A2C  mov         ecx,dword ptr [ebp-8]  
00226A2F  add         ecx,1  
00226A32  mov         dword ptr [ebp-8],ecx  
00226A35  mov         edx,dword ptr [ebp-8]  
00226A38  add         edx,1  
00226A3B  mov         dword ptr [ebp-8],edx  
                printf("j = %d\n", j);
00226A3E  mov         eax,dword ptr [ebp-14h]  
                printf("j = %d\n", j);
00226A41  push        eax  
00226A42  push        228FF0h  
00226A47  call        00221050  
00226A4C  add         esp,8  
这个是vs2017反编译的计算结果
综上,我觉得这个是编译器的问题,你问哪个才是结果,我个人觉得vc6是我们理解的那种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-11 13:57:15 | 显示全部楼层
枫叶007 发表于 2020-2-11 12:10
那答案到底是多少呢

不是说了吗,这类问题没有正确答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 05:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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