关于《C,C++表达式求值顺序 裘老的解释。》的疑问

常书 2014-09-29 10:54:13
引用原文如下:
"对于:
a=4;
cout << a++ << a;
我们知道它是
(cout.operator <<(a++)).operator << (a);
的简写。先看外层函数调用,这里需要算出所用函数由加下划线的一段得到),还需要计算a的值。语言没有规定哪个先算。如果真的先算函数,这一计算中出现了另一次函数调用,在被调函数体执行前有一个顺序点,那时a++的副作用就会实现。如果是先算参数,求出a的值4,而后计算函数时的副作用当然不会改变它(这种情况下输出两个4)。当然,这些只是假设,实际应该说的是:这种东西根本不该写,讨论其效果没有意义。"

为方便讨论:
1.将cout称为对象A
2.将cout.operator<<(a++)返回的对象称为对象B
问题如下:
1,上面引文中,蓝色加亮部分分别指的是哪个对象的函数?
2,算出所用函数指的是什么意思?是执行函数?
3,平时用cout的时候,都是用的cout<<a<<b<<endl,执行顺序是打印a,然后打后b,最后换行,裘老的上面解释对这个执行顺序没有异议吧?
4.按裘老的前一个假设输出的是4,5?后一个假设的先算参数的话,参数不是要变成5了吗,他指的是怎么个算法?
5.按个人理解,上例中如果只是cout<<a++,这时输出4是没有问题的,问题在于对后一个调用传的的参数是计算后的还是计算前的,这里的没定义指的是计算后还是计算前都符合规定,也就是歧义的地方是整个表达式,a++真正执行是在B对象调用函数前,还是调用函数后,根据裘老的说法,函数调用前是一个顺序点,按我的理解,在B对象调用函数前,所有的副作用不是流言要实现了吗?不是应该要输出的4,5吗?(我用的DEV C++运行这段代码的结果就是4 5)
好凌乱啊,求指点。。。。

...全文
170 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
常书 2014-09-30
  • 打赏
  • 举报
回复
解惑了,参考:http://bbs.csdn.net/topics/380213111 operator<<(operator<<(operator<<(cout, a), a++), endl) 具体说来是红色的那一层operator<<的两个参数operator<<(cout, a)和a++的求值顺序由编译器自行决定。如果先求出前者输出就是44,如果先求出后者输出就是54。而45在正常情况下是不可能的。 后一个指针的例子,则还有编译器的乱序优化小聪明。 至于究竟什么才是“定义了的行为”,请自行网上搜索C++顺序点。
常书 2014-09-30
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
我的回帖中已经解释的很清楚了。
将置顶中的所有贴子看了一遍,赵老师的回复主要讲两点: 1.根据自己的编译器看汇编,找结果,不迷信书本、文字等 2.提了下各运算符优先级 我的问题在于,根据某一汇编,cout<<a++<<a<<endl;它的顺序是明确的,但是如果同一段代码用不同的编译器 编译得到的汇编执行结果不同,这是不能容忍的,我想知道的这些汇编生成的规则,如果只知其然,不知其所以 然,掉坑是必然的。 抛开裘老的解释,我的问题在于,对于cout<<a++<<a;这种语句,编译器要遵循什么规则来编译,哪个顺序是未 定义的? 根据目前的结果,要么它输出4,4,要么它输出4,5 输出4,4,则该命令相当于: cout<<a cout<<a a++; 输出4,5,该命令相当于: cout<<a a++; cout<<a 如果只迷信这样的结果,很容易做出,第一步肯定是cout<<a是没问题的,问题在于a++对于后一个输出是否起作用,这样的论 断有问题,接下来的例子是这样的: a=4; cout<<a<<a++; 1个可能的输出的结果是5,4 那么这又相当于是 tmp = a; a++; cout<<a; cout<<tmp; 对于上面这两个例子,编译系统是根据什么原则来编译的,表示不理解
赵4老师 2014-09-29
  • 打赏
  • 举报
回复
我的回帖中已经解释的很清楚了。
常书 2014-09-29
  • 打赏
  • 举报
回复
没人吗,顶顶

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧