C ++如何在这个程序中执行cout?

时间:2013-07-25 05:38:27

标签: c++

如何首先执行tryout.main()cout,然后打印main()函数cout,最后打印tryout.main()的返回值。这有点令人困惑。任何人都可以解释一下吗?

#include<iostream>
using namespace std;
class TryOut
{
public:
 int main()
 {
    std::cout<<"In TryOut Main Function "<<std::endl;
    return 0;
 }
};

int main(int argc, char **argv)
{
TryOut tryout;
std::cout<<"In Main function: "<<tryout.main()<<std::endl;
return 0;
}

输出:

In TryOut Main Function 
In Main function: 0

3 个答案:

答案 0 :(得分:4)

这是一个经过编辑的答案。我被Igor Tandetnik证明是错的,因为我的回答(错误地)被接受并且投票率最高,所以我决定重写它以使其正确。

在我们的案例中

foo() = ostream& ostream::operator<<(const char*)

按以下顺序执行的顺序:

obj.foo("str").foo(fun())

可能是:

obj.foo("str");
fun();
obj.foo(fun_res);

fun();
obj.foo("str");
obj.foo(fun_res);

在你的情况下,后者发生了,但前者也是有效的执行令。

订单保证如下:

  • fun()将在obj.foo(fun_res)之前发生,因为该调用需要foo的结果,
  • obj.foo("str")将在obj.foo(fun_res)之前发生。

因此,上述两种情况是可能的。

答案 1 :(得分:2)

表达式中子表达式的评估顺序通常是未指定的。在tryout.main()执行之前或之后,可以合法地调用std::cout<<"In Main function: "。在你的情况下,它恰好在之前被调用。

答案 2 :(得分:0)

“&LT;&LT;”当你做

时,在C ++中实际上是语法糖
cout << "Hello"

你实际上是在打电话

ostream& operator<<(ostream&, const char*)

的ostream&安培; ostream :: operator&lt;&lt;(const char *)

为方便起见,我将假设后者。当你写

std::cout<<"In Main function: "<<tryout.main()<<std::endl;

这将编译为

cout.operator<<("In Main function: ").operator<<(tryout.main()).operator<<(std::endl);

所以你写的代码是

<<tryout.main()<<

说:“调用tryout.main(),捕获返回值,并使用前一个&lt;&lt;。

所以 - 现在调用并执行tryout.main(),它独立完成它自己的输出,然后返回0.

现在你的main函数能够完成它的调用链,返回值为0作为参数。

您是否有理由无法通过调试器逐步完成此操作?