我有一些代码最近被移植到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