关于cout输出的顺序原理

 我们都知道cout<<的输出原理是先从右向左计算,再从左往右输出

想了解可以参考下面资料:

C++输出流cout的执行顺序问题_知之可否的博客-CSDN博客_cout执行顺序

 但我如果再出一个题目呢?

int a=0;
cout<<a++<<a<<endl;

按照先前的说法,先计算a值,也就是0,然后计算a++,但由于是后置运算符输出结果也是0,所以我们可以猜测输出结果应该是:00

但实际上结果是:01

这是为什么呢?难道编译器改为从左向右计算了吗?

当然不可能。

虽然暂时没有找到相关资料能解释这个问题,但经过一些实验,我认为编译器在计算过程中并不是单纯地记录a当时的值,而是记录了a的地址,等到这个输出语句计算完毕,这个时候a的值就是要输出的值。

这也同时很好解释了为什么"cout<<a++<<++a<<endl"的结果为1 2

这与我之前写的:”重定义后置递增运算符遇到的问题 “有所关联,因为它们都涉及到了运算符定义的问题,以下是运算符的默认定义(个人理解,可能有误):

 int& operator++()                            //前置递增
   {
     *this=*this+1; 
     return *this;
    }                  


 int operator++(int)                          //后置递增
	{
		int temp =*this;
		++* this;
		return temp;
	}

通过运算符定义,我们知道++a不仅仅进行了加1运算,更是返回了a这个变量本身,使得编译器记录了a的地址,而a++返回的是一个没有地址的常量

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值