例如,有以下语句:
int i = 3;
printf("%d,%d,%d\n", i, ++i, ++i );
许多人认为输出必然是
3,4,5
实际不尽然. 在Turbo C和Visual C++ 6.0系统中输出是
5,5,4
因为这些系统的处理方法是:按自右至左的顺序求函数参数的值. 先求出最右面一个参数(++i)的值4, 再求出第2个参数(++i)的值为5, 最后求出最左面的参数(i)的值5.
如果改为下面的printf语句:
printf("%d,%d,%d\n", i, i++, i++)
在Turbo C和Visual C++ 6.0系统中输出是
3,3,3
求值的顺序依然是自右至左,但是需要注意的是:对于i++, 什么时候指向i自加1的操作? 由于i++是'后自加", 是在执行完printf语句后再使i加1, 而不是在求出最右面一项的值(值为3)之后i的值立即加1, 所以3个输出项的值都是i的原值3.
C标准没有具体规定函数求值的顺序是自左至右,还是自右至左. 但是每个C编译程序都规定了自己的顺序, 在多数情况下,从左到右求解和从右到左求解的结果是相同的
, 所以人们对此没有感到有什么问题.
例如:
fun1(a+b,b+c,c+a);
fun1是一个函数名, 有3个实参表达式;a+b, b+c, c+a. 在一般情况下,自左至右和自右至左地求这3个表达式都是一样的,但前面举得例子则不同.
因此,应该使程序具有通用性 , 不会在不同的编译环境下得到不同的结果.不使用会引起二义性的用法.如果错误1例中希望输出"3, 4, 5"时,可以改用;
i = 3;
j = i++;
k = ++j;
printf("%d, %d, %d", i, j, k);
以上内容摘自"C程序设计(第四版)" 的p367.