【C】没有注意系统对函数参数的求值顺序的处理方法

来源:互联网 发布:组织架构图 知乎 编辑:程序博客网 时间:2024/05/28 15:45

没有注意系统对函数参数的求值顺序的处理方法


错误1

例如,有以下语句:

  1. int i = 3;
  2. 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.


错误2

如果改为下面的printf语句:

  1. 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编译程序都规定了自己的顺序, 在多数情况下,从左到右求解和从右到左求解的结果是相同的, 所以人们对此没有感到有什么问题.
例如:

  1. fun1(a+b,b+c,c+a);

fun1是一个函数名, 有3个实参表达式;a+b, b+c, c+a. 在一般情况下,自左至右和自右至左地求这3个表达式都是一样的,但前面举得例子则不同.
因此,应该使程序具有通用性 , 不会在不同的编译环境下得到不同的结果.不使用会引起二义性的用法.如果错误1例中希望输出"3, 4, 5"时,可以改用;

  1. i = 3;
  2. j = i++;
  3. k = ++j;
  4. printf("%d, %d, %d", i, j, k);

以上内容摘自"C程序设计(第四版)" 的p367.

0 0
原创粉丝点击