0

如何先执行 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
4

3 回答 3

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)

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

于 2013-07-25T05:44:19.787 回答
2

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

于 2013-07-25T05:45:43.907 回答
0

C++ 中的“<<”实际上是语法糖,当你这样做时

cout << "Hello"

你实际上是在打电话

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

或者

ostream& ostream::operator<<(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(),捕获返回值,并使用前一个 << 返回的 ostream 将其传递给“ostream::operator<<(int)”。

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

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

您是否有无法使用调试器逐步完成此操作的原因?

于 2013-07-25T08:08:48.447 回答