学习笔记—— 形参默认值、函数声明、函数嵌套

本文详细介绍了C++中函数的几种关键特性,包括形参默认值的设定与使用、函数声明的方法及其作用、以及函数嵌套调用的概念与实例演示。通过具体的代码示例,帮助读者理解这些特性的应用。

一、形参默认值

通常情况下,由实参负责传值给形参。有时,也可以定义形参的默认值,当函数调用时 没提供对应的实参时,形参采用默认值 当函数有多个形参时,有默认值的形参必须放在最后。

【例 1】带默认值的形参
#include<iostream>
using namespace std;
void f(int n = 10)
{
for (int i = 0; i < n; i++)
{
cout << "*";
}
cout << endl;
}
int main()
{
f(5);
f();
return 0;
}
运行结果:
*****
**********
说明:调用 f(5)时,实参 5 传给了形参 n,故 n 不采用默认值 10;调用 f()时,由于没有实
参,故形参 n 采用默认值 10。

 

【例 2】多个形参中有默认值的靠后
#include<iostream>
using namespace std;
double f(int a, double b = 10, int c = 100)
{
return a + b + c;
}
int main()
{
cout << f(1, 2, 3) << endl;
cout << f(1, 2) << endl;
cout << f(1) << endl;
return 0;
}
运行结果:
6
103
111
说明:调用 f(1, 2, 3)时,a=1, b=2, c=3;调用 f(1,2)时,a=1, b=2, c=100;调用 f(1)时,a=1, 
b=10, c=100。
如果把 f 定义成 double f(double b = 10, int a, int c = 100),则会编译报错,因为 b 有默
认值但没有靠后。

二、函数声明

函数必须先定义后使用,这点跟变量相同,因而所有在 main 函数里调用的自定义函数 都必须在 main 函数之前定义。对于很长的程序,这样做会很不方便找到 main 函数在哪儿。 另外还有一些其他原因也会导致无法做到先定义函数。 可以先对要定义的函数进行声明,这样就可以放在靠后的位置定义函数。

【例 3】函数声明
#include<iostream>
using namespace std;
int f(int a, int b); //函数声明
int main()
{
cout << f(1, 2) << endl;
return 0;
}
int f(int a, int b) //函数定义(函数实现)
{
return a + b;
}
上面的代码相当于
#include<iostream>
using namespace std;
int f(int a, int b)
{
return a + b;
}
int main()
{
cout << f(1, 2) << endl;
return 0;
}
说明:函数声明就是把函数头单独成一句话(要记得加分号;)。当函数声明后,即可以调用,
但要记得在后面实现函数的定义。

 三、函数嵌套
函数嵌套是指函数调用时可以嵌套调用,函数定义不能嵌套在另一个函数定义中(匿名
函数除外,还没讲到)。
一个函数可以把另一个函数(包括自己,不可以是 main 函数)的返回值作为实参(只
能当右值用,对应的不能是引用形参)。


【例 4】嵌套调用
#include<iostream>
using namespace std;
int f(int a, int b)
{
return a + b;
}
int g(int a)
{
return a * 2;
}
int main()
{
cout << f(f(1, 2), f(3, 4)) << endl;
cout << g(g(5)) << endl;
cout << g(f(6, 7)) << endl;
return 0;
}
运行结果:
10
20
26
说明:f(f(1, 2), f(3, 4))中,外层的 f 函数的第一个实参是 f(1, 2)的返回值 3,第二个实参是 f(3, 
4)的返回值 7,故相当于 f(3,7),所以返回 10。
g(g(5))中,外层的 g 函数的实参是 g(5)的返回值 10,故相当于 g(10),所以返回 20。
g(f(6,7))中,外层 g 函数的实参是 f(6,7)的返回值 13,故相当于 g(13),所以返回 26。
【例 7】最大公因数(函数代码)
方法二:辗转相除法(最大公因数的最快计算方法)
求正整数 a 和 b 的最大公因数
1、c=a%b,a=b,b=c
2、一直重复上述三句话,直到 b 等于 0 为止,此时 a 的值就是原来 a 和 b 的最大公因数。
例如 a=6, b=26
① c=6, a=26, b=6 ② c=2, a=6, b=2 ③ c=0, a=2, b=0
结束,此时 a=2,是 6 和 26 的最大公因数
int getGCD(int a, int b)
{
int c;
while (b != 0)//当退出循环的时候,b==0
{
c = a%b;
a = b;
b = c;
}
return a;
}

### C语言函数形参默认值的设置方法 在C语言中,直接为函数形参设置默认值并非标准特性。然而,可以通过一些技巧实现类似的功能。以下是几种常见的实现方式及其原理: #### 1. 使用宏定义实现默认值 通过宏定义,可以在调用函数时自动插入默认值。例如: ```c #define fun(...) _fun((123, ##__VA_ARGS__)) void _fun(int val) { printf("fun input val: %d\n", val); } ``` 在此代码中,`fun` 是一个宏,它会在编译时展开为 `_fun(123)` 或 `_fun(val)`,具体取决于是否提供了额外参数[^2]。 #### 2. 使用条件判断设置默认值函数内部通过条件语句检查参数是否为特定值(如 `0` 或 `-1`),并为其赋默认值。例如: ```c #include <stdio.h> void fun(int a) { if (a == -1) { // 假设-1表示未提供值 a = 123; // 设置默认值 } printf("fun input val: %d\n", a); } int main() { fun(-1); // 使用默认值 fun(321); // 使用指定值 return 0; } ``` 这种方式需要调用者显式传递一个特殊的“占位符”值来表示使用默认值[^5]。 #### 3. 利用可变参数实现默认值 通过 `stdarg.h` 库支持的可变参数机制,可以模拟默认值的效果。例如: ```c #include <stdio.h> #include <stdarg.h> void fun(int def_val, ...) { va_list args; va_start(args, def_val); int val = va_arg(args, int); if (val == -1) { // 假设-1表示未提供值 val = def_val; // 使用默认值 } printf("fun input val: %d\n", val); va_end(args); } int main() { fun(123, -1); // 使用默认值 fun(123, 321); // 使用指定值 return 0; } ``` 此方法允许为每个调用指定不同的默认值[^2]。 #### 注意事项 - 在相同的作用域内,不允许对同一个函数的多个声明重复定义默认值,即使前后定义的值相同也不行[^3]。 - 默认值的设置应遵循自右向左的原则,即右侧的参数优先设置默认值[^4]。 ### 示例代码 以下是一个综合示例,展示如何通过宏定义和条件判断实现默认值功能: ```c #include <stdio.h> #define fun(...) _fun((123, ##__VA_ARGS__)) void _fun(int val) { printf("fun input val: %d\n", val); } void another_fun(int a) { if (a == -1) { // 假设-1表示未提供值 a = 123; // 设置默认值 } printf("another_fun input val: %d\n", a); } int main() { fun(); // 使用默认值 fun(321); // 使用指定值 another_fun(-1); // 使用默认值 another_fun(456); // 使用指定值 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值