表达式1
a*b+c*d+e*f;
注释:表达式1在计算的时候,由于“++”比“+”的优先级高,只能保证“++”的计算是比“+”早,但是优先级并不能决定第三个“*”比第一个“+”早执行。
所以表达式的计算机顺序可能是:
a*b
c*d
e*f
a*b+c*d+e*f
或者:
a*b
c*d
a*b+c*d
e*f
a*b+c*d+e*f
表达式2
c + --c;
注释:同上,操作符的优先级只能决定"–“的运算在“+”的运算前面,但是我们并没有办法得知”+"操作符的左操作数的获取在右操作数之前还是之后,所以结果是不可预测的,是有歧义的。
表达式3
int fun()
{
static int count = 1;
return ++count; }
int main()
{
int answer;
answer = fun() - fun() * fun();
printf( "%d\n", answer);//输出多少?
return 0;
}
注释:虽然在大多数的编译器上求得结果都是相同的。但是上述代码 answer = fun() - fun() * fun()中我们只能通过操作符的优先级得知:先算乘法,再算减法。函数的调用先后顺序无法通过操作符的优先级确定。
表达式4
#include <stdio.h>
int main()
{
int i = 1;
int ret = (++i) + (++i) + (++i);
printf("%d\n", ret);
printf("%d\n",i);
return 0;
}
注释:这段代码中的第一个“+” 在执行的时候,第三个“++”是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第一个“+”和第三个“++”执行的先后顺序。