C中的一个小问题

一个朋友在学C语言,今天问我一个问题:

float x = 1;
int y = 2;
y+=++x*++x;

问x等于几,显而易见,x=3.0f,这没有悬念,但因为当时正好开着一个IDE,就复制进去跑了一下,x确实是3.0f没错,但y竟然是11!我的第一反应是,这是编译器在搞鬼。。于是把反汇编显示了出现,一看,彻底明白了。虽然实际工作中这种情况应该是100%不会出现,但既然发现了,就暂且记下来吧。汇编代码如下:

	int x = 1, y = 2;
00112022  mov         dword ptr [ebp-20h],1  
00112029  mov         dword ptr [ebp-2Ch],2  
	y+=++x*++x;
00112030  mov         eax,dword ptr [ebp-20h]  
00112033  add         eax,1  
00112036  mov         dword ptr [ebp-20h],eax  
00112039  mov         ecx,dword ptr [ebp-20h]  
0011203C  add         ecx,1  
0011203F  mov         dword ptr [ebp-20h],ecx  
00112042  mov         edx,dword ptr [ebp-20h]  
00112045  imul        edx,dword ptr [ebp-20h]  
00112049  add         edx,dword ptr [ebp-2Ch]  
0011204C  mov         dword ptr [ebp-2Ch],edx

您可能还喜欢...

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

扫码去手机上看