经测试,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
所以,虽然--的优先级高于*,但他不是全部--做完再做乘运算。
当然,这牵涉到编译原理,以及语法分析等相关问题。由于没学过编译原理,就不多说了。