zkp1234 发表于 2020-11-27 14:13:27

自增自减和加减乘除的等级运算关系

很想不明白 为什么结果是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;            
}

风过无痕1989 发表于 2020-11-27 14:20:44

输出 10100

小甲鱼的铁粉 发表于 2020-11-27 14:31:44

风过无痕1989 发表于 2020-11-27 14:20
输出 10100

我的也是

小甲鱼的铁粉 发表于 2020-11-27 14:42:22

本帖最后由 小甲鱼的铁粉 于 2020-11-27 14:44 编辑

7:      printf("第二个%d\n",(++a)+(a++)*(a--));
00401049   mov         edx,dword ptr       ;edx = 99
0040104C   add         edx,1                      ;edx = 99 + 1 = 100
0040104F   mov         dword ptr ,edx      ;a = edx = 100
00401052   mov         eax,dword ptr       ;eax = a = 100
00401055   imul      eax,dword ptr       ;eax = eax * a = 10000
00401059   mov         ecx,dword ptr       ;ecx = a = 100
0040105C   add         ecx,eax                     ;ecx = ecx + eax = 10100
0040105E   mov         dword ptr ,ecx      ;b = ecx = 10100, b只是暂时的一个变量,方便理解
00401061   mov         edx,dword ptr       ;edx = b = 10100
00401064   push      edx
00401065   push      offset string "\xb5\xda\xb6\xfe\xb8\xf6%d\n" (0042201c)
0040106A   mov         eax,dword ptr       ;eax = a = 100
0040106D   sub         eax,1                     ;eax = eax - 1 = 99
00401070   mov         dword ptr ,eax       ;a = eax = 99
00401073   mov         ecx,dword ptr        ;ecx = a = 99
00401076   add         ecx,1                      ;ecx = ecx + 1 = 100
00401079   mov         dword ptr ,ecx       ;a = ecx = 100
0040107C   call      printf (004010c0)
00401081   add         esp,8

这是printf("第二个%d\n",(++a)+(a++)*(a--));编译为汇编的代码,每一句后面的;之后的是注释
所以执行顺序是
++a --> a * a + a --> 输出 --> a--    --> a++

小甲鱼的铁粉 发表于 2020-11-27 14:47:03

而且这个东西用不同的编译器运行的答案是不一样的,我用的vc++结果是10100,用另一个就变成10200了{:10_250:},我又要秃了

起飞飞飞飞飞~ 发表于 2020-11-27 14:56:34

第一次输出之后 a变成99
第二次输出时   先执行++a   
++a后   a=100
a++后a=101
也就是 100+100*101=10200

风过无痕1989 发表于 2020-11-27 15:36:13

小甲鱼的铁粉 发表于 2020-11-27 14:31
我的也是

第1个 printf() 运行后,a = 99;
第2个 printf() ,++a,先自加后运算,就变成 100 了,a++ 是运算后自加,所以运算时的值是 100,a- - 也是先运算,后自减,所以运算时也是 100,故:
100 + 100 * 100 = 100 + 10000 = 10100

zkp1234 发表于 2020-11-29 15:37:45

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

看不懂这是啥

zkp1234 发表于 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我也不知道到底是啥了

风过无痕1989 发表于 2020-11-29 15:50:08

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

你老师说得不对,你自己运行一下程序,就知道程序最后的结果是:10100,而不是:10200

zkp1234 发表于 2021-1-29 10:34:53

不好意思生活有点乱刚刚想起来还没说   这个其实就是个ub东西说白了就是各家编译器执行的不同    谢谢大家的回复
页: [1]
查看完整版本: 自增自减和加减乘除的等级运算关系