#include <iostream>
// 流输出操作符 <<
// 1) 针对内置类型,只是普通的操作符
// 2) 而针对自定义类型 ,涉及到重载操作符,所以应该是 操作符函数,既然是函数,就牵扯到顺序点的问题。
// 在进入operater<< 函数前,完成实参表达式的求值计算(注意:计算顺序不定)
// (注意顺序点:执行被调函数前的最后时刻,副作用生效,将数据从寄存器copy到内存栈),
// 而后,执行函数,使用求值完成后的实际变量(或表达式返回的临时对象)的结果定义并初始化行参。
void explain()
{
// 先计算各个操作符要结合的 操作数(或表达式返回值),
// 然后,在使用各个操作符将 求值完成后得到的实参变量值(或表达式返回值)的结果输出,
/*******************************************************************************
* 例如:std::cout << i++ << i << ++i;
* i++ :+1运算,然后返回i 的origin值
* ++i :+1运算,然后返回寄存器中运算的值 origin+1(实时),而非变量在内存中对应的值
* i :取变量在内存中对应的值
* 将得到的3个值用操作符输出
* 另外,
* (1)前2者的计算顺序是不确定的
* (2)未到达下一个顺序点,副作用未必生效,所以i的取值可能是origin、origin+1 或 origin+2
******************************************************************************/
int i = 4;
std::cout << i++ << i;
std::cout << std::endl;
int a = 4;
std::cout << a << a++;
std::cout << std::endl;
/*
45
54
*/
}
int main ()
{
int a = 1;
// std::out << a << a++ << a << std::endl;
std::cout << a << (a++ || 0) << a << std::endl; // 212
explain();
return 0;
}
C/C++ 表达式求值的example,布布扣,bubuko.com
C/C++ 表达式求值的example