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

C++ How cout is excuted in this program?

本文关键字:程序 执行 cout C++      更新时间:2023-10-16

如何先执行tryout.main()cout,然后打印main()函数cout,最后打印tryout.man()的返回值。这有点令人困惑。有人能解释吗?

#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

这是一个经过编辑的答案。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的结果
  • CCD_ 5将发生在CCD_ 6之前

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

表达式中子表达式的求值顺序通常是未指定的。可以在执行CCD_ 8之前或之后合法地调用CCD_。在您的情况下,它恰好以前被调用过。

当你进行时,C++中的

"<<"实际上是语法糖

cout << "Hello"

你实际上是在给打电话

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

ostream&ostream::运算符<lt;(常量字符*)

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

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

这将编译为

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

所以你写的代码

<<tryout.main()<<

says:"调用tryout.main(),获取返回值,并将其传递给"ostream::operator<lt;(int)",使用上一个<<.返回的ostream

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

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

你不能用调试器来完成这个过程是有原因的吗?