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
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
近期评论