如何首先执行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
答案 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作为参数。
您是否有理由无法通过调试器逐步完成此操作?