|
|
发表于 2004-12-4 03:56:00
|
显示全部楼层
在BC3.1下:
k=(a++)+(++a)+(a++); 则 k=6+6+6=18, a=8;
k=(a++)+(++a)+(++a); 则 k=7+7+7=21, a=8;
k=(++a)+(a++)+(++a); 则 k=7+7+7=21, a=8;
k=(++a)+(++a)+(a++); 则 k=7+7+7=21, a=8;
k=(++a)+(++a)+(++a); 则 k=8+8+8=24, a=8;
而在gcc下:
k=(a++)+(++a)+(a++); 则 k=6+6+6=18, a=8;
k=(a++)+(++a)+(++a); 则 k=5+7+7=19, a=8;
k=(++a)+(a++)+(++a); 则 k=7+5+7=19, a=8;
k=(++a)+(++a)+(a++); 则 k=7+7+7=21, a=8;
k=(++a)+(++a)+(++a); 则 k=7+7+8=22, a=8;
比较这些结果可以看出,对于同时有多个+操
作符的表达式,BC3.1及类似的编译器是先求
出所有的操作数,然后才对+操作符进行求值;
而gcc等编译器则是服从先左后右的原则,即
从左往右,先计算第一个操作符,然后在计算
第二个操作符,以此类推。
PS:此类问题拿来探讨一下,以更深认识C,
无可厚非,但是实际上编程序时应该避免这种
情况出现,因为这是带有歧义性的,不同的编
译器会有不同的处理办法,而却不能说谁对谁
错,C并没有规定按那种顺序计算。 |
|