【C】没有注意系统对函数参数的求值顺序的处理方法
来源:互联网 发布:组织架构图 知乎 编辑:程序博客网 时间:2024/05/28 15:45
没有注意系统对函数参数的求值顺序的处理方法
错误1
例如,有以下语句:
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.
错误2
如果改为下面的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.
0 0
- 【C】没有注意系统对函数参数的求值顺序的处理方法
- 注意:C语言中没有指定同一运算符的多个操作数或者某函数各个参数的求值顺序,如果代码的执行结果和求值顺序有关,都是不好的程序设计风格。
- 关于lisa参数求值的顺序
- C printf函数对参数的计算顺序,是从右往左的
- C语言 printf函数对参数的计算顺序自加自减的讨论
- printf函数的求值顺序问题
- 关于C/C++的求值顺序问题
- c有没有处理目录的函数
- C++编程规范之31:不要编写依赖于函数参数求值顺序的代码
- Java方法对传递参数的处理
- 函数参数求值顺序和默认值
- BAPI_ACC_DOCUMENT_POST,如何处理没有的参数传入系统
- 表达式的求值顺序
- 一个以前没有注意的问题:java构造函数的执行顺序
- 实参求值顺序及参数间的数据传递
- c 语言函数可变参数的处理
- 函数访问参数受限的处理方法
- 分割函数参数的逗号并不是逗号运算符,因此其求值顺序是未定义,不确定的。
- android以流的方式读取文件
- 随机抽取的sql语句
- equals和==及hashcode的区别
- 无锁队列的实现
- 代码部署中,如何更新core.php
- 【C】没有注意系统对函数参数的求值顺序的处理方法
- 报winsock被破坏,网络不通,ping报错,开机慢
- Objective C--观察者模式
- Linux CentOS memcached 安装
- 实用网站记录
- 史上最全的hadoop
- 嵌入式专题: S5PV210 - MPEG4编码
- 查看oracle11g的alert日志路径
- js面向对象编程:如何检测对象类型