首先评估哪个默认参数,为什么?

时间:2011-08-30 21:39:49

标签: c++

我有三个功能,funt1()funt2()funt3()

int funt1()
{
    cout<<"funt1 called"<<endl;
    return 10;
}

int funt2()
{
    cout<<"funt2 called"<<endl;
    return 20;
}

void funt3(int x=funt1(), int y=funt2())
{
    cout << x << y << endl;
}

我的main功能:

int main()
{
    funt3();
    return 0;
}

当我在funt3()方法中调用main()时,为什么先调用funt1(),然后调用funt2()

8 个答案:

答案 0 :(得分:3)

这取决于你的编译器。其他人可能先致电funct2()。 C或C ++都不保证函数参数的评估顺序。

请参阅Parameter evaluation order before a function calling in C

答案 1 :(得分:2)

C ++标准没有定义它,所以它完全是特定于编译器的。也就是说,你应该从不依赖于未定义行为的实例。

编辑:如果您真的希望将函数调用保留为默认参数,以减少每次我建议您执行以下操作时必须通过的参数数量:

void funt3(int x, int y)
{
    cout<<x<<y<<endl;
}

void funt3(int x)
{
    funt3(x, funt2());
}

void funt3()
{
    funt3(funt1());
}

答案 2 :(得分:1)

该语言不需要任何特定订单。使用的顺序将取决于编译器。

答案 3 :(得分:0)

这是因为funt3(sp?)的参数需要计算x然后y。在考虑funt1()的内容之前,funt2()然后funt3

答案 4 :(得分:0)

编译器特定,从那里下载到CPU。 CPU可能会将该调用分支到单独的分支中,它可能会尝试做一些预测,或者如果CPU认为func1比func2快,它将在func2之前运行func1和一堆其他操作,以便进行优化。

答案 5 :(得分:0)

由于C ++标准没有定义顺序所以它依赖于编译器。

您可以简单地尝试一些流行的c ++编译器:GCC,VS2008 / VS2010等。 然后你会看到完全不同的结果。

答案 6 :(得分:0)

编译器依赖。它可能是funt1然后funt2然后funt3或任何其他组合。

答案 7 :(得分:0)

正如其他人所指出的那样,C ++标准没有规定功能参数的评估顺序。这允许每个编译器选择最佳顺序,无论该顺序是由方便还是效率决定的。

您甚至可能会发现订单可以根据您为编译器提供的优化标记进行更改。

为了保证函数调用的顺序,您需要在调用之间引入sequence point。我通过创建函数的两个不同版本来实现此目的,因此只有一个函数调用作为参数。

void funt3(int x, int y=funt2())
{
    cout << x << y << endl;
}

void funt3()
{
    int x = funt1();
    funt3(x);
}