std::cout 功能的特殊行为
Peculiar behavior of std::cout functionality
我试图习惯指针算法,在指针指向的地址和值上使用递增运算符。
我用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
我试图用 postfix ++ 弄清楚 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;
我试图习惯指针算法,在指针指向的地址和值上使用递增运算符。
我用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
我试图用 postfix ++ 弄清楚 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;