cout 的执行顺序问题

三尺青萍 2012-03-08 05:14:03
#include<string>
#include<iostream>
#include<stdio.h>
using namespace std;
main()
{
char str[] = "Hapqy New year!";
char *s =str;
int a=4;
cout<<a<<a++<<endl;//为什么输出的是54而不是45
*s++;
cout<<(*s)++<<*s++<<endl;//为什么输出的是aa,而不是pa

cout<<*s<<endl;//输出的是Hbpqy New year!
//printf("%s\n",*str);
cout<<str<<endl;
return 0;
}
...全文
184 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuexiacm 2012-10-22
  • 打赏
  • 举报
回复
第一个是cout输出时从左到右,但是里面有表达式时,是从右到左先计算表达式,然后压入栈中,输出自然是先栈顶,即从左道右。
第二个是运算符优先级的问题,*的优先级高于++,因此*s++是先去*s输出,在进行自增操作
aquanull 2012-03-08
  • 打赏
  • 举报
回复
operator<<(operator<<(operator<<(cout, a), a++), endl)
具体说来是红色的那一层operator<<的两个参数operator<<(cout, a)a++的求值顺序由编译器自行决定。如果先求出前者输出就是44,如果先求出后者输出就是54。而45在正常情况下是不可能的。
后一个指针的例子,则还有编译器的乱序优化小聪明。
至于究竟什么才是“定义了的行为”,请自行网上搜索C++顺序点
自信男孩 2012-03-08
  • 打赏
  • 举报
回复
跟输出顺序有关。有的编译器可能是从左到右计算输出,有的是从右向左计算并输出。
xiyoulaoyuanjia 2012-03-08
  • 打赏
  • 举报
回复

cout整个表达式中的子表达式的求值顺序是没有指定的,而各个表达式之间都在a上操作,并改变a的状态(即:表达式的副作用)
所以你这个式子的行为是未定义的,应当去避免这种行为,而不应该去解释这些未定义的东西。
pengzhixi 2012-03-08
  • 打赏
  • 举报
回复
这个与cout的输出顺序无关。cout的输出顺序是确定的。
问题在于表达式的求值顺序
cout<<expression1<<expression2<<endl;
输出肯定是从左到右。问题在于expression1和expression2的求值顺序是不确定的所以导致了你那样的输出结果。

64,675

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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