是有点不可思议,开始我认为是括号运算符引起的,但后面还有一个括号,值不应该还要多一个吗?后我自己做了个例子,仔细看了汇编后的代码,我觉得是编译器引起的,不知道是不是bug
#include "stdio.h"
int main(void)
{
int i=0,q=0;
q=++i+(++i)+(++i);
return 0;
}
5: int i=0,q=0;
00401268 mov dword ptr [ebp-4],0
0040126F mov dword ptr [ebp-8],0
6: q=++i+(++i)+(++i);
00401276 mov eax,dword ptr [ebp-4]
00401279 add eax,1
0040127C mov dword ptr [ebp-4],eax ++i一次i=1
0040127F mov ecx,dword ptr [ebp-4]
00401282 add ecx,1 正常的++i的操作是送到eax中,但这个却送到ecx
00401285 mov dword ptr [ebp-4],ecx ++i两次i=2,先做括号的原因
00401288 mov edx,dword ptr [ebp-4]
0040128B add edx,dword ptr [ebp-4] ++i+(++i)=2+2=4-->edx,这里已经出现了不可理解的数,中间结果没有另外开辟空间存储。
0040128E mov eax,dword ptr [ebp-4]
00401291 add eax,1
00401294 mov dword ptr [ebp-4],eax ++i三次i=3
00401297 add edx,dword ptr [ebp-4] i+edx=3+4=7
0040129A mov dword ptr [ebp-8],edx q=7
7: return 0;