鱼C论坛

 找回密码
 立即注册
查看: 1090|回复: 10

[已解决]自增自减和加减乘除的等级运算关系

[复制链接]
发表于 2020-11-27 14:13:27 | 显示全部楼层 |阅读模式

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

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

x
很想不明白 为什么结果是10200  不应该是99+1   +   100*100=10100吗
大佬们救救孩子吧
#include<stdio.h>

int main()
{
int a=100;
printf("第一个%d \n",--a); //99
printf("第二个%d\n",(++a)+(a++)*(a--));
return 0;            
}

最佳答案
2020-11-27 15:36:13


第1个 printf() 运行后,a = 99;
第2个 printf() ,++a,先自加后运算,就变成 100 了,a++ 是运算后自加,所以运算时的值是 100,a- - 也是先运算,后自减,所以运算时也是 100,故:
100 + 100 * 100 = 100 + 10000 = 10100
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-27 14:20:44 | 显示全部楼层
输出 10100
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 14:31:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 14:42:22 | 显示全部楼层
本帖最后由 小甲鱼的铁粉 于 2020-11-27 14:44 编辑
7:        printf("第二个%d\n",(++a)+(a++)*(a--));
00401049   mov         edx,dword ptr [ebp-4]      ;edx = 99
0040104C   add         edx,1                      ;edx = 99 + 1 = 100
0040104F   mov         dword ptr [ebp-4],edx      ;a = edx = 100
00401052   mov         eax,dword ptr [ebp-4]      ;eax = a = 100
00401055   imul        eax,dword ptr [ebp-4]      ;eax = eax * a = 10000
00401059   mov         ecx,dword ptr [ebp-4]      ;ecx = a = 100
0040105C   add         ecx,eax                     ;ecx = ecx + eax = 10100
0040105E   mov         dword ptr [ebp-8],ecx      ;b = ecx = 10100, b只是暂时的一个变量,方便理解
00401061   mov         edx,dword ptr [ebp-8]      ;edx = b = 10100
00401064   push        edx
00401065   push        offset string "\xb5\xda\xb6\xfe\xb8\xf6%d\n" (0042201c)
0040106A   mov         eax,dword ptr [ebp-4]      ;eax = a = 100
0040106D   sub         eax,1                     ;eax = eax - 1 = 99
00401070   mov         dword ptr [ebp-4],eax       ;a = eax = 99
00401073   mov         ecx,dword ptr [ebp-4]       ;ecx = a = 99
00401076   add         ecx,1                      ;ecx = ecx + 1 = 100
00401079   mov         dword ptr [ebp-4],ecx       ;a = ecx = 100
0040107C   call        printf (004010c0)
00401081   add         esp,8
这是printf("第二个%d\n",(++a)+(a++)*(a--));编译为汇编的代码,每一句后面的;之后的是注释
所以执行顺序是
++a --> a * a + a --> 输出 --> a--    --> a++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 14:47:03 | 显示全部楼层
而且这个东西用不同的编译器运行的答案是不一样的,我用的vc++结果是10100,用另一个就变成10200了,我又要秃了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 14:56:34 | 显示全部楼层
第一次输出之后 a变成99
第二次输出时   先执行++a   
++a后   a=100  
a++后a=101  
也就是 100+100*101=10200

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
小甲鱼的铁粉 + 2 + 2 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2020-11-27 15:36:13 | 显示全部楼层    本楼为最佳答案   


第1个 printf() 运行后,a = 99;
第2个 printf() ,++a,先自加后运算,就变成 100 了,a++ 是运算后自加,所以运算时的值是 100,a- - 也是先运算,后自减,所以运算时也是 100,故:
100 + 100 * 100 = 100 + 10000 = 10100
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-29 15:37:45 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-11-27 14:42
这是printf("第二个%d\n",(++a)+(a++)*(a--));编译为汇编的代码,每一句后面的;之后的是注释
所以执行顺 ...

看不懂  这是啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-29 15:39:20 | 显示全部楼层
风过无痕1989 发表于 2020-11-27 15:36
第1个 printf() 运行后,a = 99;
第2个 printf() ,++a,先自加后运算,就变成 100 了,a++ 是运算后 ...

我们老师说那个后面的a--继承了a++的值 好像是因为是加号所以额外运算  所以成了100+100*101  我也不知道到底是啥了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-29 15:50:08 | 显示全部楼层
zkp1234 发表于 2020-11-29 15:39
我们老师说那个后面的a--继承了a++的值 好像是因为是加号所以额外运算  所以成了100+100*101  我也不知道 ...

你老师说得不对,你自己运行一下程序,就知道程序最后的结果是:10100,而不是:10200
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-29 10:34:53 | 显示全部楼层
不好意思生活有点乱刚刚想起来还没说   这个其实就是个ub东西  说白了就是各家编译器执行的不同    谢谢大家的回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 04:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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