我有一些代碼最近被移植到VS.接下來是聲明和彙編器生成的,希望'錯誤'是顯而易見的。當然,它生成這個代碼的方式可能是VS的一個特性,但我不能說我以前見過這個。在VS2013中的一個語句中多指針增量的解決方法
switchcount = (int) (*d++) + (*d++<<8) + (*d++<<16) + (*d++<<24);
00A722F6 mov eax,dword ptr [d]
00A722F9 movzx ecx,byte ptr [eax]
00A722FC mov edx,dword ptr [d]
00A722FF movzx eax,byte ptr [edx]
00A72302 shl eax,8
00A72305 add ecx,eax
00A72307 mov edx,dword ptr [d]
00A7230A movzx eax,byte ptr [edx]
00A7230D shl eax,10h
00A72310 add ecx,eax
00A72312 mov edx,dword ptr [d]
00A72315 movzx eax,byte ptr [edx]
00A72318 shl eax,18h
00A7231B add ecx,eax
00A7231D mov dword ptr ds:[0AD8CA8h],ecx
00A72323 mov ecx,dword ptr [d]
00A72326 add ecx,1
00A72329 mov dword ptr [d],ecx
所以編譯器產生的代碼基本上
switchcount = (int) (*d) + (*d<<8) + (*d<<16) + (*d<<24);
d += 4 ;
誰能告訴我如何說服編譯器生成正確的代碼?
非常感謝您提供清晰簡潔的答案。 很遺憾,這些語言的設計師在工作時並不記得小學BODMAS/BOMDAS。方括號應確保增量在左括號上從左到右發生。 – mvandere 2014-08-29 21:38:40