有个看似很简单的C++问题,但是,真的迷糊了,可能是基础学的不好吧,希望有人能帮我解释一下,谢谢了.
问题是这样的,这么一个C++程序:
#include<stdlib.h>
#include<iostream.h>
int main()
{
int a(5),b(0);
b=++a *--a;
cout<<b<<endl;
system("Pause");
return 0;
}
看上去真的很简单,也很基础,答案是25
当时用这么个方法去解释:
++和--是单目运算符,*是双目运算符,于是先++a后为6,再--a后为5,结果就是5*5=25.
用OD反汇编一下,看反汇编代码:
00401058 . C745 FC 05000000 mov dword ptr ss:[ebp-4],5 //[ebp-4]=5
0040105F . C745 F8 00000000 mov dword ptr ss:[ebp-8],0 //[ebp-8]=0
00401066 . 8B45 FC mov eax,dword ptr ss:[ebp-4] //eax=[ebp-4]=5
00401069 . 83C0 01 add eax,1 //eax=eax+1=6;也就是++a
0040106C . 8945 FC mov dword ptr ss:[ebp-4],eax //把结果还给[ebp-4]=6
0040106F . 8B4D FC mov ecx,dword ptr ss:[ebp-4] //ecx=[ebp-4]=6
00401072 . 83E9 01 sub ecx,1 //ecx=ecx-1=5;也就是--a
00401075 . 894D FC mov dword ptr ss:[ebp-4],ecx //再把结果还给[ebp-4]
00401078 . 8B55 FC mov edx,dword ptr ss:[ebp-4] //edx=[ebp-4]=5
0040107B . 0FAF55 FC imul edx,dword ptr ss:[ebp-4] //edx=edx*[ebp-4]=5*5
0040107F . 8955 F8 mov dword ptr ss:[ebp-8],edx //把edx的值给[ebp-8]
00401082 . 68 0F104000 push 1.0040100F
证实了上面的结论,答案的确是5*5=25
不过,稍微再变下形,又觉得上面的解释有点不清楚了:
这么改:
#include<stdlib.h>
#include<iostream.h>
int main()
{
int a(5),b(0);
b=++a *--a*++a;
cout<<b<<endl;
system("Pause");
return 0;
}
这个改后,再用反汇编代码看了下:
00401058 . C745 FC 05000000 mov dword ptr ss:[ebp-4],5
0040105F . C745 F8 00000000 mov dword ptr ss:[ebp-8],0
00401066 . 8B45 FC mov eax,dword ptr ss:[ebp-4]
00401069 . 83C0 01 add eax,1
0040106C . 8945 FC mov dword ptr ss:[ebp-4],eax
0040106F . 8B4D FC mov ecx,dword ptr ss:[ebp-4]
00401072 . 83E9 01 sub ecx,1
00401075 . 894D FC mov dword ptr ss:[ebp-4],ecx
00401078 . 8B55 FC mov edx,dword ptr ss:[ebp-4]
0040107B . 0FAF55 FC imul edx,dword ptr ss:[ebp-4]
0040107F . 8B45 FC mov eax,dword ptr ss:[ebp-4]
00401082 . 83C0 01 add eax,1
00401085 . 8945 FC mov dword ptr ss:[ebp-4],eax
00401088 . 0FAF55 FC imul edx,dword ptr ss:[ebp-4]
0040108C . 8955 F8 mov dword ptr ss:[ebp-8],edx
0040108F . 68 0F104000 push 1.0040100F
00401094 . 8B4D F8 mov ecx,dword ptr ss:[ebp-8]
00401097 . 51 push ecx
00401098 . B9 88004300 mov ecx,1.00430088
这时候,发现,计算机是先做++a*--a这个乘法,接着再++a,然后再相乘,结果变为了
5*5*6=150
但按照优先级,不是先应该++a,接着--a,再++a么?
也就是6------5-------6,结果是6*6*6=216么?
实在迷糊,望有人给解释下,谢谢了.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课