经测试,vc6和gcc的结果z都是4。
它是这样算出来的,首先是算第一个乘号,它的两个操作数都有--运算,所以先做两个减减,x=2,所以第一个乘号的结果是4,之后第二个乘号,后面的操作数有--,先做--,x=1,所以最后是 4*1=4;整个过程是2*2*1;这个根据反汇编代码推出来的。
虽然--的优先级高于*,但是语法树分析应该是依次扫描的。
此外,c语言的变量都存放在内存中。在VC6下查看汇编代码,没经过优化的,发现如下:
6:
z=--x*--x*--x;
0040105F
mov
ecx,dword ptr [ebp-4]
;dword ptr [ebp-4]就是变量x
00401062
sub
ecx,1
00401065
mov
dword ptr [ebp-4],ecx
00401068
mov
edx,dword ptr [ebp-4]
0040106B
sub
edx,1
0040106E
mov
dword ptr [ebp-4],edx
00401071
mov
eax,dword ptr [ebp-4]
00401074
imul
eax,dword ptr [ebp-4]
00401078
mov
ecx,dword ptr [ebp-4]
0040107B
sub
ecx,1
0040107E
mov
dword ptr [ebp-4],ecx
00401081
imul
eax,dword ptr [ebp-4]
00401085
mov
dword ptr [ebp-10h],eax
所以,虽然--的优先级高于*,但他不是全部--做完再做乘运算。
当然,这牵涉到编译原理,以及语法分析等相关问题。由于没学过编译原理,就不多说了。