【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);//函数调用点
}

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

    原文作者:QX_a11
    原文地址: https://blog.csdn.net/QX_a11/article/details/84619665
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞