我有小 C 代码:
#include<stdio.h>
int main()
{
int z[]= {1,2,3,4,5,6};
int i = 2, j;
printf("i=%d \n",i);
z[i] = i++;
for (j=0;j < 6;j++ )
printf ("%d ", z[j]);
printf("\ni=%d \n",i);
}
输出:
i=2
1 2 2 4 5 6
i=3
计算表达式的优先顺序是首先,计算 z[i]。因为 i 在这里是 2,所以它变成 z[2]。接下来,计算 i++,即产生 2,i 变为 3。最后,执行 =,并将 2(即从 i++ 产生的值)放入 z[2]
这解释了上述输出,即 1 2 2 4 5 6
但是如果我们把上面的代码从 i++ 改成 ++i 即
#include<stdio.h>
int main()
{
int z[]= {1,2,3,4,5,6};
int i = 2, j;
printf("i=%d \n",i);
z[i] = ++i;
for (j=0;j < 6;j++ )
printf ("%d ", z[j]);
printf("\ni=%d \n",i);
}
然后输出就奇怪的不同了,那就是:
i=2
1 2 3 3 5 6
i=3
如果我们按照上述优先级(C 规范所说的 [index] 早于 ++ 绑定),那么输出应该是 1 2 3 4 5 6。
我只是想知道为什么上面的优先顺序不能解释这一点?
我的编译器是 ubuntu 11.04 上的 gcc 4.5.2
谢谢和问候, 卡皮尔