在“cout”语句中调用带有“cout”语句的函数

时间:2012-07-22 20:52:22

标签: c++ function cout

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

#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 ++标准有关,或者它的行为因编译器而异?

3 个答案:

答案 0 :(得分:18)

未指定评估函数参数的顺序。您的行对于编译器来说是这样的:

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

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

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

然后打破那个,没有说明首先调用函数print()还是子表达式:

operator<<(cout, "The Lucky ")

所以,回答你的问题:

  

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

它可能因编译器而异。

答案 1 :(得分:4)

让我们只调用operator << {。{1}}。

现在我们可以写

operator

as

cout << "The Lucky"

此操作的结果为operator(cout, "The Lucky") ,并传递给下一个cout,因此我们可以写

<<

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

所以对于一些编译器,你真的可能会得到

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

答案 2 :(得分:0)

在我的编译器中No:Lucky 3是输出....这意味着它的行为因编译器而异。