函数参数的默认值为“passing_parametr”* 2

时间:2014-05-18 19:29:29

标签: c++ function scope

我写了以下内容:

#include <stdio.h>

int foo(int x, int y=2*x)
{
    return y;
}

int main()
{
    printf("%d\n",foo(5));
}

但我编译错误error: local variable ‘x’ may not appear in this context 但是我预计它会没问题,因为3.3.4 / 1:

  

在函数声明中,或在除。之外的任何函数声明符中   函数定义的声明者(8.4),参数名称(如果   供应)具有功能原型范围,最终终止   最近的封闭函数声明符。

结束最近的封闭函数声明符是},声明点紧跟在int x之后。那为什么它不起作用呢?

3 个答案:

答案 0 :(得分:5)

这不是因为范围。 8.3.6/7

  

不应在默认参数中使用局部变量。

8.3.6/9

  

每次调用函数时都会计算默认参数。功能评估的顺序   论证没有特别说明。 因此,函数的参数不得用于默认参数,   即使它们未被评估。在默认参数之前声明的函数的参数在范围内   并且可以隐藏命名空间和类成员名称。

禁止这样做是有道理的,因为函数参数的评估顺序是未指定的。如果在y的参数之前评估2*xx的价值是多少?

答案 1 :(得分:1)

此代码段是否适合您?

#include <stdio.h>

int foo(int x, int y)
{
    return y;
}

int foo(int x)
{
    return foo(x, x*2);
}

int main()
{
    printf("%d\n",foo(5));
}

答案 2 :(得分:0)

当你写了2个参数时,你正在向foo函数发送一个arg 这样它应该有效:

int foo(int x)
{
    int y=2*x;
    return y;
}

int main()
{
    printf("%d\n",foo(5));
}