std::cout 在 C++ 中的行为?[复制]

Behavior of std::cout in C++? [duplicate]

提问人:Arnaud M. 提问时间:1/10/2022 更新时间:1/10/2022 访问量:64

问:

我正在用这个小代码观察到一个奇怪的行为:

#include <iostream>
#include <cstdio>

using namespace std;

int get_input()
{
    int val;
    cin >> val;
    return val;
}

int main()
{
    cout << "Res = " << get_input() << "\n";
    //printf("Res = %d\n", get_input());
}

我通过这个命令以最简单的方式编译了它(我也尝试过不使用 -std 选项):

g++ -Wall -std=c++17 -o test.exe test.cpp

当我执行代码时,我看到

Res =

在适当的位置有一个空行等待用户输入。 我所期望的行为是在返回 get_input 函数后显示“Res =”。这是我使用C++在线编译器(如 cpp.sh)时观察到的行为。

谁能向我解释一下这里发生了什么?

我在 Debian 11 上的 gcc 版本是:

g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

多谢

C++ IOstream 库特

评论

0赞 WhozCraig 1/10/2022
这些运算符<<调用并没有执行您似乎认为的那样。
0赞 Jabberwocky 1/10/2022
下次请不要描述您期望的输出,而是展示它。
0赞 Adrian Mole 1/10/2022
链接的问题解释了 C++17 及更高版本的序列定义良好。不过,不确定 C++ 17 之前的情况。Clang-cl(在 C++14 上)不会标记任何未排序的操作(当它们存在时,它通常会这样做)。

答:

0赞 Sudeep Prasad 1/10/2022 #1

这里有两件事在起作用:运算符优先级和表达式计算顺序。<<情况下的运算符优先级是从左到右。在以前版本的编译器中未定义计算顺序;现在是。

正如这个出色的答案中所描述的,计算顺序现在与运算符优先级兼容,这意味着它从左到右发生:

  1. cout << "Res = "首先发生。运算符返回 cout 本身的实例。<<
  2. 然后发生,在哪个时间点被调用。 ...等等。cout << get_input()get_input

它曾经因编译器而异,但现在它是标准化的。