7 、函数
一、函数定义🧀
“代码复制”是程序不良的表现 → 包装成函数
\[ y=f(x) \]
和数学上函数类似:接受参数,返回值
调用函数
-
函数名(参数值)
-
()
起到表示函数调用的作用- 即使没有参数也要
()
- 即使没有参数也要
-
如果有参数,需要给出正确的数量和顺序
Example
1、函数返回🧀
return
停止函数执行,并送回一个值
- 一个函数中可以有多个return语句
- 🚫 没有返回值的函数(
void
类型)
- 不能写
return 值;
- 可以没有
return;
- 调用时不能赋值:
Danger
如果函数声明了返回值类型(如 int
),则必须使用 return 值
; 返回相应类型的值!
return 0;
平台 | 含义 / 行为 |
---|---|
Windows | if errorlevel 1 用于判断程序是否成功 |
Unix Bash | echo $? 输出上一个程序的返回值 |
C Shell | echo $status 显示退出状态 |
return 0;
通常表示程序正常退出,非零值代表异常/错误退出。
2、函数原型🧀
- 函数顺序关系:
在 C 语言中,编译器从上往下逐行分析代码。
如果先使用函数、后定义函数,会出现“未定义函数”错误。
函数声明
int main() { printf("The bigger one is: %d", max(10, 20)); // 后调用 return 0; } ```
二、参数传递🧀
1、类型不匹配🧀
- C 语言传统上容忍类型不匹配。
- 编译器通常会自动转换类型(例如 float → int),可能导致精度丢失。
- 在 C++ / Java 等语言中,这类隐式转换会直接报错或强烈警告。
2、值传递🧀
⚠️ 为什么不能交换?
C 语言只能进行值传递(Pass by Value)。
- 实参的值会复制一份传给函数参数;
- 函数中对参数的修改不会影响原变量。
三、本地变量🧀
- 每次函数调用时,会创建一个独立的变量空间
- 在函数内部定义的变量,称为本地变量
- 函数参数也是一种本地变量
📅 生存期(Lifetime)& 📦 作用域(Scope)
- 生存期:变量从创建到销毁的时间段
- 作用域:变量在代码中可见/可访问的范围
对于本地变量:生存期 = 作用域 = 所在的块
{}
stateDiagram-v2
state 块 {
生存期 : 变量存在于进入和退出之间
作用域 : 变量仅在此块内有效
}
Tip
- 可以定义在函数块中、语句块中,甚至随便一对
{}
中:
- 在块外部定义的变量在内部依然有效:
- 内部定义同名变量会掩盖外部变量:
-
不能在同一个块中定义重名变量
-
本地变量不会自动初始化(值为随机)
-
参数在调用函数时自动初始化(来自实参)
四、 规范🧀
1、无参数情况🧀
2、不嵌套定义🧀
所有函数必须在全局作用域下单独定义。