cout消息的顺序不符合预期

时间:2014-04-26 09:46:42

标签: c++

执行时,我对下面代码的输出感到困惑。

代码:

int add(int a, int b)
{
    cout<<"inside int add function"<<endl;
    return a+b;
}

float add(float a, float b)
{
    cout<<"inside float add function"<<endl;
    return a+b;
}

int main()
{
    cout<<add(10.0f,20.0f)<<endl<<add(20,50); 
    return 0;
}

输出:

inside int add function
inside float add function
30
70

我不明白cout消息的顺序是在控制台中打印出来的。但我期望上面的程序输出如下

inside float add function
30
inside int add function
70

有人可以解释一下上述行为。

2 个答案:

答案 0 :(得分:7)

您的代码中的这一行:

cout<<add(10.0f,20.0f)<<endl<<add(20,50);

将由编译器翻译成:

operator<<(operator<<(operator<<(cout,add(10.0f,20.0f)),endl),add(20,50));

由于标准没有规定功能参数的评估顺序,因此add(20,50)之前就会operator<<(operator<<(cout,add(10.0f,20.0f)),endl)进行评估。

答案 1 :(得分:1)

预计行cout<<add(10.0f,20.0f)<<endl<<add(20,50);会打印您的输出:

inside int add function
inside float add function
30
70

这是因为打印到cout首先调用add(10.0f , 20.0f)并将输出存储到内部变量,然后调用add(10, 20)并将输出存储到另一个内部变量,最后打印出来返回值。像这样:

float a = add(10.0f, 20.0f);
int b = add(10, 20);
cout << a << endl << b;

在这种情况下,如果您想要打印,请尝试打印第一个功能,然后打印另一个功能:

cout << add(10.0f, 20.0f) << endl;
cout << add(10, 20);