自增自减和加减乘除的等级运算关系
很想不明白 为什么结果是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;
}
输出 10100 风过无痕1989 发表于 2020-11-27 14:20
输出 10100
我的也是 本帖最后由 小甲鱼的铁粉 于 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++ 而且这个东西用不同的编译器运行的答案是不一样的,我用的vc++结果是10100,用另一个就变成10200了{:10_250:},我又要秃了 第一次输出之后 a变成99
第二次输出时 先执行++a
++a后 a=100
a++后a=101
也就是 100+100*101=10200 小甲鱼的铁粉 发表于 2020-11-27 14:31
我的也是
第1个 printf() 运行后,a = 99;
第2个 printf() ,++a,先自加后运算,就变成 100 了,a++ 是运算后自加,所以运算时的值是 100,a- - 也是先运算,后自减,所以运算时也是 100,故:
100 + 100 * 100 = 100 + 10000 = 10100 小甲鱼的铁粉 发表于 2020-11-27 14:42
这是printf("第二个%d\n",(++a)+(a++)*(a--));编译为汇编的代码,每一句后面的;之后的是注释
所以执行顺 ...
看不懂这是啥 风过无痕1989 发表于 2020-11-27 15:36
第1个 printf() 运行后,a = 99;
第2个 printf() ,++a,先自加后运算,就变成 100 了,a++ 是运算后 ...
我们老师说那个后面的a--继承了a++的值 好像是因为是加号所以额外运算所以成了100+100*101我也不知道到底是啥了
zkp1234 发表于 2020-11-29 15:39
我们老师说那个后面的a--继承了a++的值 好像是因为是加号所以额外运算所以成了100+100*101我也不知道 ...
你老师说得不对,你自己运行一下程序,就知道程序最后的结果是:10100,而不是:10200 不好意思生活有点乱刚刚想起来还没说 这个其实就是个ub东西说白了就是各家编译器执行的不同 谢谢大家的回复
页:
[1]