std::cout功能的特殊行为

Peculiar behavior of std::cout functionality

本文关键字:cout 功能 std      更新时间:2023-10-16

我试图习惯指针算法,在指针指向的地址和值上都使用增量运算符。

我用std::cout来检查我的理解,我发现了我无法轻易消化的东西,让我们看看(这是函数main内部的代码):

int R = 0;
std::cout << 0 << 1 << 2 << 3 << endl;
std::cout << R++ << R++ << R++ << R++ << endl;
R = 0; // R value reset to Zero;
std::cout << ++R << ++R << ++R << ++R << endl;

结果将是:

0123
3210
4444

我试着用后缀++来理解cout的行为,但当我考虑到它前缀为++的行为时,我完全崩溃了。并简单地意识到:这是一个堆叠式流动的问题。提前谢谢大家。

std::cout << R++ << R++ << R++ << R++ << endl;

翻译为:

std::cout.operator<<(R++).operator(R++).operator(R++).operator(R++).operator<<(endl);

由于该语言不保证函数参数的求值顺序,因此您的代码具有未定义的行为。

如果要强制排序,请使用圆括号强制编译器按您期望的顺序计算表达式;

((((std::cout << R++) << R++) << R++) << R++) << endl;

这是C++未定义的行为之一:在同一序列点修改同一变量。

您应该使用单独的cout语句(用;分隔)来获得有保证的结果:

int R = 0;
std::cout << 0;
std::cout << 1;
std::cout << 2;
std::cout << 3 << std::endl;
std::cout << R++;
std::cout << R++;
std::cout << R++;
std::cout << R++ << std::endl;
R = 0; // R value reset to Zero;
std::cout << ++R;
std::cout << ++R;
std::cout << ++R;
std::cout << ++R << std::endl;