【c语言】函数的默认参数 您所在的位置:网站首页 c语言中定义函数时如果未指定函数类型 【c语言】函数的默认参数

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

2024-07-07 20:31| 来源: 网络整理| 查看: 265

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

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

第一点:

先写一段简单的代码:

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有