我写了以下内容:
#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
之后。那为什么它不起作用呢?
答案 0 :(得分:5)
这不是因为范围。 8.3.6/7
说
不应在默认参数中使用局部变量。
和8.3.6/9
:
每次调用函数时都会计算默认参数。功能评估的顺序 论证没有特别说明。 因此,函数的参数不得用于默认参数, 即使它们未被评估。在默认参数之前声明的函数的参数在范围内 并且可以隐藏命名空间和类成员名称。
禁止这样做是有道理的,因为函数参数的评估顺序是未指定的。如果在y
的参数之前评估2*x
,x
的价值是多少?
答案 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));
}