我们都知道cout<<的输出原理是先从右向左计算,再从左往右输出
想了解可以参考下面资料:
C++输出流cout的执行顺序问题_知之可否的博客-优快云博客_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++返回的是一个没有地址的常量