免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2197 | 回复: 7
打印 上一主题 下一主题

[C] 编程时使用表达式作为函数的传入参数,有没有固定的求值顺序? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-07 09:51 |只看该作者 |倒序浏览
本帖最后由 safedead 于 2013-05-07 09:52 编辑

C编程时使用表达式作为函数的传入参数,有没有固定的求值顺序?
C++呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-05-07 10:27 |只看该作者
既然不确定, 何必依赖? 预先计算好再传入便可.

论坛徽章:
0
3 [报告]
发表于 2013-05-07 10:32 |只看该作者
本帖最后由 ttand 于 2013-05-07 10:32 编辑

顺序没有标准化,完全由编译器决定。先算好再传入需要中间对象,直接在函数args里写表达式传入的是右值。可以有右值优化。效率更高

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-05-07 10:42 |只看该作者
linux_c_py_php 发表于 2013-05-07 10:27
既然不确定, 何必依赖? 预先计算好再传入便可.


如果不确定,那我就可以在内部代码规范添加一条:函数参数禁止使用表达式

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2013-05-07 10:52 |只看该作者
safedead 发表于 2013-05-07 10:42
如果不确定,那我就可以在内部代码规范添加一条:函数参数禁止使用表达式


工作的人不容易做出类似++i, i++的事吧...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-05-07 11:22 |只看该作者
linux_c_py_php 发表于 2013-05-07 10:52
工作的人不容易做出类似++i, i++的事吧...


这种明显的UB不会,但是隐形的东西很麻烦,举个极端的例子

void fun1(char *a, char *b);//fun1依赖a和b指向的内存数据
char *fun2(char *a);//fun2会改变a指向内存的内容,并返回一个指向a的指针
char *fun3(char *b);//fun3会改变b指向内存的内容,并返回一个指向b的指针

函数调用:
fun1(fun2(a), fun3(b));//万一a和b指向的地址相同或是空间交叠,不就坑人了吗?

该用的中间变量还是别省掉,编译器很聪明,会把不必要的中间变量优化成寄存器

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
7 [报告]
发表于 2013-05-07 11:26 |只看该作者
这么说还是值得规定一下的.

论坛徽章:
0
8 [报告]
发表于 2013-05-07 12:54 |只看该作者
safedead 发表于 2013-05-07 10:42
如果不确定,那我就可以在内部代码规范添加一条:函数参数禁止使用表达式


这个不太恰当
禁止使用有side effect的表达式作为实参可能更恰当些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP