18

我在弄乱代码时遇到了这种相当模糊的行为,这是示例:

#include <iostream>

using namespace std;


int print(void);

int main(void)
{
    cout << "The Lucky " << print() << endl;     //This line
    return 0;
}

int print(void)
{
    cout << "No : ";
    return 3;
}

在我的代码中,带有注释的语句//This line应该打印出来 The Lucky No : 3,而是打印出来No : The Lucky 3。是什么导致了这种行为?这是否与 C++ 标准有关,或者它的行为因一个编译器而异?

4

3 回答 3

18

未指定函数参数的评估顺序。您的行在编译器中看起来像这样:

operator<<(operator<<(operator<<(cout, "The Lucky "), print()), endl);

语句中的主要调用是以 endl 作为参数的调用。未指定是先计算第二个参数 endl 还是先计算更大的子表达式:

operator<<(operator<<(cout, "The Lucky "), print())

并且分解那个,未指定print()是首先调用函数还是子表达式:

operator<<(cout, "The Lucky ")

所以,回答你的问题:

是什么导致了这种行为?这是否与 C++ 标准有关,或者它的行为因一个编译器而异?

它可能因编译器而异。

于 2012-07-22T21:01:42.660 回答
4

让我们operator <<简单地调用operator.

现在我们可以写

cout << "The Lucky"

作为

operator(cout, "The Lucky")

这个操作的结果是cout,并传递给next <<,所以我们可以这样写

operator(operator(cout, "The Lucky"), print() )

这是一个带有两个参数的函数调用,标准没有说明它们的评估顺序。

所以使用一些编译器你真的可能会得到

The Lucky No : 3
于 2012-07-22T21:02:35.083 回答
0

在我的编译器中 No: The Lucky 3 is the output.... 这意味着它的行为因编译器而异。

于 2015-11-20T17:11:05.103 回答