免费注册 查看新帖 |

Chinaunix

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

可以理解为g++右求值的吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-08 15:18 |只看该作者 |倒序浏览
#include <iostream>
void display (int a,int b){
        std::cout << "a=" << a << ",b=" << b;
}

int main(){
        int i;
        i = 5;
        display (i,i++);
}

这个结果是 a=6,b=5

论坛徽章:
0
2 [报告]
发表于 2008-11-08 15:34 |只看该作者

回复 #1 俯卧撑 的帖子

跟编译器有关,有的可能  a=5,b=5
这个例子说明 g++上cout先右后左的。

论坛徽章:
0
3 [报告]
发表于 2008-11-08 16:17 |只看该作者
原帖由 waternie 于 2008-11-8 15:34 发表
跟编译器有关,有的可能  a=5,b=5
这个例子说明 g++上cout先右后左的。

你的解释有误,display (i,i++);中的i和i++的计算顺序是未定义的(比如,这里从右向左计算)
对于cout的输出,必定是按顺序从左向右来的(事实上,是多次函数调用)

论坛徽章:
0
4 [报告]
发表于 2008-11-08 20:21 |只看该作者
原帖由 tyc611 于 2008-11-8 16:17 发表

你的解释有误,display (i,i++);中的i和i++的计算顺序是未定义的(比如,这里从右向左计算)
对于cout的输出,必定是按顺序从左向右来的(事实上,是多次函数调用)

为什么说是多次调用呢?用汇编能看出来么?
我理解是g++调用是从右向左传值,不知对否

论坛徽章:
0
5 [报告]
发表于 2008-11-08 20:28 |只看该作者
原帖由 俯卧撑 于 2008-11-8 20:21 发表

为什么说是多次调用呢?用汇编能看出来么?
我理解是g++调用是从右向左传值,不知对否

看来你还不理解cout的工作流程,事实上这里的“std::cout << "a=" << a << ",b=" << b;”会产生如下调用:
operator<< (
    operator<< (
        operator << (
            operator<< (std::cout, "a="),
            a
         ),
         ",b="
     ),
     b
);

每次operator<<函数调用的返回值都是参数中的std::cout,所以能够一直写下去

论坛徽章:
0
6 [报告]
发表于 2008-11-08 22:22 |只看该作者

回复 #1 俯卧撑 的帖子

按照标准定义,函数参数的入栈顺序应该是从右往左,就是先计算i++,在计算i
所以a = 6, b = 5
当然编译器不同,函数的调用实现会不同
但是main函数一定是遵循从右往左的压栈顺序的

论坛徽章:
0
7 [报告]
发表于 2008-11-08 22:25 |只看该作者

回复 #5 tyc611 的帖子

至于cout的工作模式,其实不重要,因为参数是单向值传递,在调用了这个函数的时候
a,b就是确定的值了。所以,cout的调用模式和a,b的值是没有关系的。
你的解释其实和LZ的问题关系不大

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [报告]
发表于 2008-11-08 22:29 |只看该作者
原帖由 tyc611 于 2008-11-8 16:17 发表

你的解释有误,display (i,i++);中的i和i++的计算顺序是未定义的(比如,这里从右向左计算)
对于cout的输出,必定是按顺序从左向右来的(事实上,是多次函数调用)


正解.
C/C++对求值顺序没有明确的定义,具体看编译器实现.
但是 逗号, 分号; 问号冒号? :这三个可是严格按照从左到右的顺序执行的

论坛徽章:
0
9 [报告]
发表于 2008-11-08 22:37 |只看该作者
原帖由 goldenhunter 于 2008-11-8 22:22 发表
按照标准定义,函数参数的入栈顺序应该是从右往左,就是先计算i++,在计算i
所以a = 6, b = 5
当然编译器不同,函数的调用实现会不同
但是main函数一定是遵循从右往左的压栈顺序的

标准没有指定参数的入栈顺序(对于这点,你可以查阅一下调用约定的相关知识),也没有指定表达式中子表达式的计算顺序

论坛徽章:
0
10 [报告]
发表于 2008-11-08 22:39 |只看该作者
原帖由 goldenhunter 于 2008-11-8 22:25 发表
至于cout的工作模式,其实不重要,因为参数是单向值传递,在调用了这个函数的时候
a,b就是确定的值了。所以,cout的调用模式和a,b的值是没有关系的。
你的解释其实和LZ的问题关系不大

我只是回答lz的提问而已,请看我在5楼回复中的红色引用内容(lz的提问)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP