本帖最后由 人造人 于 2018-12-28 13:02 编辑
答案是不确定,标准对这类代码行为的定义是“未定义”,也就是说编译器爱怎么搞就怎么搞
编译器可以先算x*x,然后把x的结果减2
或者... 嗯,我认为我描述不清楚,看下面的代码吧
例1. x=10
int y = x-- * x--;
先算x*x,结果为100,y的最终结果为100,然后把x减2,x的最终结果为8
例2. x=10
int y = x-- * x--;
这个不好解释
这个计算的是9 * 10,y的最终结果为90,x最终为8
看下面汇编代码吧,你也许现在看不懂,但是如果你要深入研究这些,你必须要学习汇编语言
#include <stdio.h>
int main(void)
{
012C17A0 55 push ebp
012C17A1 8B EC mov ebp,esp
012C17A3 81 EC D0 00 00 00 sub esp,0D0h
012C17A9 53 push ebx
012C17AA 56 push esi
012C17AB 57 push edi
012C17AC 8D BD 30 FF FF FF lea edi,[ebp-0D0h]
012C17B2 B9 34 00 00 00 mov ecx,34h
012C17B7 B8 CC CC CC CC mov eax,0CCCCCCCCh
012C17BC F3 AB rep stos dword ptr es:[edi]
int x = 10;
012C17BE C7 45 F8 0A 00 00 00 mov dword ptr [x],0Ah
printf("%d\n", x-- * x--);
012C17C5 8B 45 F8 mov eax,dword ptr [x]
012C17C8 0F AF 45 F8 imul eax,dword ptr [x]
012C17CC 89 85 30 FF FF FF mov dword ptr [ebp-0D0h],eax
012C17D2 8B 4D F8 mov ecx,dword ptr [x]
012C17D5 83 E9 01 sub ecx,1
012C17D8 89 4D F8 mov dword ptr [x],ecx
012C17DB 8B 55 F8 mov edx,dword ptr [x]
012C17DE 83 EA 01 sub edx,1
012C17E1 89 55 F8 mov dword ptr [x],edx
012C17E4 8B 85 30 FF FF FF mov eax,dword ptr [ebp-0D0h]
012C17EA 50 push eax
012C17EB 68 D0 7B 2C 01 push offset string "%d\n" (012C7BD0h)
012C17F0 E8 35 FB FF FF call _printf (012C132Ah)
012C17F5 83 C4 08 add esp,8
return 0;
012C17F8 33 C0 xor eax,eax
}
012C17FA 5F pop edi
012C17FB 5E pop esi
012C17FC 5B pop ebx
012C17FD 81 C4 D0 00 00 00 add esp,0D0h
012C1803 3B EC cmp ebp,esp
012C1805 E8 18 F9 FF FF call __RTC_CheckEsp (012C1122h)
012C180A 8B E5 mov esp,ebp
012C180C 5D pop ebp
012C180D C3 ret
seg000:0291 ; =============== S U B R O U T I N E =======================================
seg000:0291
seg000:0291 ; Attributes: bp-based frame
seg000:0291
seg000:0291 sub_10291 proc near ; CODE XREF: start+155p
seg000:0291 push bp
seg000:0292 mov bp, sp
seg000:0294 push si
seg000:0295 mov si, 0Ah
seg000:0298 mov ax, 291h
seg000:029B push ax
seg000:029C mov ax, 0AAh ; '
seg000:029F push ax
seg000:02A0 call sub_10EEC
seg000:02A3 pop cx
seg000:02A4 pop cx
seg000:02A5 mov ax, si
seg000:02A7 dec si
seg000:02A8 mov dx, si
seg000:02AA dec si
seg000:02AB imul dx
seg000:02AD push ax
seg000:02AE mov ax, 0B4h ; '
seg000:02B1 push ax
seg000:02B2 call sub_10EEC
seg000:02B5 pop cx
seg000:02B6 pop cx
seg000:02B7 xor ax, ax
seg000:02B9 jmp short $+2
seg000:02BB ; ---------------------------------------------------------------------------
seg000:02BB
seg000:02BB loc_102BB: ; CODE XREF: sub_10291+28j
seg000:02BB pop si
seg000:02BC pop bp
seg000:02BD retn
seg000:02BD sub_10291 endp
seg000:02BD
seg000:02BE ; ---------------------------------------------------------------------------
|