【c语言】函数的默认参数

      在c语言中是没有函数默认值的概念,可以利用宏来模拟参数默认值;在c++中可以为参数指定默认值;所谓函数默认值就是当调用点没有相对应的形参时,就自动使用默认参数,编译器会自动把默认值传递给调用语句中;设置函数默认值需要注意有以下几点

1.函数默认值一般写在声明中
2.函数的默认值必须设置为自右向左依次赋值
3.默认值只能赋一次
4.函数的默认值不能设置为局部变量

第一点:

先写一段简单的代码:

#include <iostream>
using namespace std;
int Func(int a,int b,int c = 30);//函数声明

int main()
{
	Func(10,20);//函数调用点
}
int Func(int a,int b,int c)//函数定义
{
	return a+b+c;
}

       代码在函数声明中设置了默认值,其特点是函数定义函数调用点之后,代码的调试结果是没有问题的;所有的默认值都是在编译阶段进行的,并且编译阶段是自顶向下编译的当编译到第6行时,就已经从编译过的第2行中知道了Func函数是有默认的;所以调试是没有任何问题的。现在把代码改一下:

#include <iostream>
using namespace std;
int Func(int a,int b,int c);//函数声明

int main()
{
	Func(10,20);//函数调用点
}
int Func(int a,int b,int c = 30)//函数定义
{
	return a+b+c;
}

    注意一下,这时函数的默认被设置在了函数定义里;调试一下,会出现这样的错误:

1>c:\users\dell\desktop\源.cpp(7): error C2660: “Func”: 函数不接受 2 个参数

       同样的道理,编译是自顶向下的,在编译到第6行时,这个时候只能知道函数声明(定义点在调用点的下面,无法知道函数定义中的默认值),而函数声明中并没有设置默认值。所以总结出函数默认值的第一条,函数默认值一般写在声明中,声明一般在调用的前面

第二点:

#include <iostream>
using namespace std;
int Func(int a =10,int b,int c = 30);//函数声明
int Func(int a,int b,int c)//函数定义
{
	return a+b+c;
}
int main()
{
	Func(20);//函数调用点
}

   调试这段代码会出现以下的错误:

1>c:\users\dell\desktop\源.cpp(3): error C2548: “Func”: 缺少参数 2 的默认参数
1>c:\users\dell\desktop\源.cpp(10): error C2660: “Func”: 函数不接受 1 个参数

在声明中只对第一个和第三个数字进行的默认值的设置,而在函数的调用点只有一个参数,参数的传递是自左向右一一对应的,实参会覆盖声明中对a默认值的设置,c使用默认值,而b接受不到值的传递;所以函数的默认值必须设置为自右向左依次赋值,以防参数的遗漏

第三点:

#include <iostream>
using namespace std;
int Func(int a,int b,int c = 30);//函数声明
int Func(int a,int b,int c = 15)//函数定义
{
	return a+b+c;
}
int main()
{
	Func(10,20);//函数调用点
}

对函数声明和定义中对同一个变量设置默认值;调试代码会出现以下的错误

1>c:\users\dell\desktop\源.cpp(5): error C2572: “Func”: 重定义默认参数 : 参数 3

这是因为重定义变量c,使编译器产生二义性,编译器不知道使用30还是15,编译器只能报错;所以默认值只能赋一次

第四点:

默认值的限制:函数的默认值不能设置为局部变量,可以是全局变量,和函数的返回值(前提是函数在设有默认值的声明之前)

 

四点已经总结完了,那么下面的代码是否正确呢

#include <iostream>
using namespace std;
int Func(int a,int b,int c = 30);//函数声明
int Func(int a,int b = 15,int c)//函数定义
{
	return a+b+c;
}
int main()
{
	Func(10,20);//函数调用点
}

结果是正确的,编译自上向下,虽然默认值分别设置在了函数声明和函数定义中,仍然满足自右向左赋值,也没有度统一变量重复设置默认值,综上,结果是没有任何问题滴!

  • 9
    点赞
  • 14
    收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 6

打赏作者

QX_a11

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值