C++异常阻止cout打印

4
在下面的代码中:
#include <iostream>
using namespace std;

int f()
{
    throw 1;
}

int main()
{
    try
    {
        cout << "Output: " << f() << endl;
    }
    catch (int x)
    {
        cout << x;
    }
}

为什么没有打印出"Output: "?难道不应该先调用operator<<(cout, "Output: "),然后再调用operator<<(cout, f())吗?如果这一行是原子操作,那么打印是如何被反转的呢?

为什么你认为 cout 会像这样使用分配律?难道先不是应该先计算所有的参数吗? - PaulMcKenzie
我忽略了 f() 可能会在 operator<<(cout, "Output: ") 之前被评估的事实。我认为参数将从左到右进行评估。 - Igor Ševo
2个回答

7
<< 运算符的参数计算顺序在C++标准中没有明确定义。看起来你的编译器会先计算所有参数,然后再实际打印输出。

这对于单个语句中的任何两个表达式都是正确的,而不仅仅是运算符<<,对吗?这也是为什么我们不应该编写int i = 0; std::cout << ++i << "\n" << i++ << "\n";int i = 0; f(i++, i++);或者俗话说的int i; i = i++ + ++i; - 5gon12eder
1
@5gon12eder 不完全是这样,这涉及到“序列点”的问题。你可以查阅更多信息。但通常情况下确实如此。 - Quentin
1
@Quentin 是的,我应该补充一下,不引入序列点的单语句(希望这是正确的措辞)。 - 5gon12eder

2

可能有助于将实际的运算符函数调用视为组装成operator<<(operator<<(operator<<(cout, "Output:"), f()), endl):然后您可以看到operator<<(cout, "Output:")f()只是传递给另一个调用operator<<的两个函数参数:没有关于哪个函数参数首先被评估的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接