05-函数与附加的程序文件
为避免不必要的修改,可以将部分代码独立成一个区块,这个区块可以用代码中的函数
的形式表示
简而言之就是建立一个DLC
1.函数
基本函数格式:
int funktion_name(____x /*声明变量(录入值)____为变量类型*/){
int y _______
____________ //____:函数调用x得出y的值的过程
return y; //返回值
}
int
:函数的数据类型,和return
的数据类型保持一致,如果返回别的数据类型,需要将int
替换
____x
:调用值
return
:返回值
函数的特点:
- 是执行特定任务的代码块;
- 可以重复使用;
- 使程序易于测试;
- 可以在不更改
调用程序
的情况下进行修改;
将 main() 分解为子任务,即使是简单的程序也更易于理解用功能实现的。
「例」下面程序计算一个数字的平方:
可以将函数置于主程序下方(但是C语言必须先声明函数)
#include <stdio.h>
int square(int x); //先声明函数---//
//
int main() { //
int x, result; //
x = 5; //
result = square(x); //
//result = x * x;__________ //
printf("The x^2 is %d\n", result);
return 0;
}
int square(int x){
int r = x * x;
return r;
}
或者:
#include <stdio.h>
int square(int x){
int r = x * x;
return r;
};
int main() {
int x, result;
x = 5;
result = square(x);
//result = x * x;
printf("The x^2 is %d\n", result);
return 0;
}
2.多个程序文件:

*.c (储存非main函数的其他函数)
*.h (头文件)
在 C 语言中,#endif
是预处理指令的一部分,用于结束由 #if
, #ifdef
, 或 #ifndef
开始的条件编译部分。 在示例中,#ifndef
和 #endif
一起使用,形成了所谓的“包含卫士”(include guard)。包含卫士的作用是防止同一个头文件被多次包含(即重复包含)。
如何工作:
**#ifndef SQUARE_H**
:
- 这行代码检查是否已经定义了名为
SQUARE_H
的宏。如果没有定义(即 "if not defined"),则编译器会继续编译#ifndef
和相应的#endif
之间的代码。
**#define SQUARE_H**
:
- 这行代码定义了一个名为
SQUARE_H
的宏。在后续的编译过程中,如果再次遇到对同一头文件的包含,#ifndef SQUARE_H
将评估为假,因为SQUARE_H
已经定义了。
**#endif**
:
- 这标记了条件编译部分的结束。
通过这种方式,即使头文件在同一编译单元中被多次包含(例如,通过不同的源文件或其他头文件间接包含),它的内容也只会被实际包含一次。这样可以防止重复定义和其他潜在的编译错误。
函数详解
声明
声明通常出现在main()函数上方,形式如下:
return_type function_name(parameters);
return_type : 函数的返回值类型,即 "_____
y = f(x)" ; funktion_name:函数名,后面有圆括号()
; parameters:"_____x
"带有声明类型的可选参数,放在括号内()
;
例如:
int funktion_name(____x /*声明变量(录入值)____为变量类型*/){
int y
return y; //返回值
}
⚠️注意 当函数不需要返回值时,但在声明中仍然必须有一个返回类型。这种情况下,使用关键字
void
。 例如display_massege函数没有返回值:
void funktion_name();
例如:
void display_message(){
print("测试成功");
};
主程序
C 的主程序通常为int main(){}
因为 return 0;
(其返回值是0
),该主程序直接执行,通常不被其他函数调用,定义return 0;
代表成功执行。出现在主程序最后一行,可以写可以不写,但是最好写上。
相关信息
C 程序必须至少具有一个 main() 的函数
函数原型,函数定义
当声明中包含参数类型和名称时,该声明称为函数原型。
例如,square 函数原型出现在 main() 上面:
#include <stdio.h>
/* 函数声明, 函数原型*/
int square (int num);
int main() {
int x, result;
x = 5;
result = square(x);
printf("%d squared is %d\n", x, result);
return 0;
}
/* 函数定义 */
int square (int num) {
int y;
y = num * num;
return(y);
}
这里 square 函数返回一个整数,并接收一个 int 类型的参数。
函数参数
按值传递参数
在调用函数时, 大多数情况下,主调函数和被调函数之间有数据传递关系,这就是有参数的函数形式。函数参数的作用是传递数据给函数使用,函数利用接收的数据进行具体的操作处理。 默认情况下,参数按值传递,这意味着将数据副本提供给被调用函数的参数。 实际变量未传递到函数中,因此函数内修改参数的值不会更改到外部对应变量的值。 传递给函数的参数按位置与参数匹配。因此,第一个参数传递给第一个参数,第二个参数传递给第二个参数,依此类推。
下面的程序演示了按值传递参数: x、y传递给sum_up
当中的a、b
#include <stdio.h>
int sum_up(int x, int y);
int main() {
int x, y, result;
x = 3;
y = 12;
result = sum_up(x ,y);
printf("%d + %d = %d", x, y, result);
return 0;
}
int sum_up(int a, int b){
a += b; // a ——> a_1
return (a);
}
输出结果: :::tips 3 + 12 = 15 :::
⚠️注意 请注意,即使参数 x 的值在 sum_up 中被改变,main() 中参数 x 的值也没有改变,因为仅将其值(副本)传递到了参数 x 中。
填空,声明带有两个 float 参数的函数 test():
void test( ___ a, ___b);
详情
float float