跳至主要內容

05-函数与附加的程序文件

黑静美...大约 5 分钟编程CcppC井

为避免不必要的修改,可以将部分代码独立成一个区块,这个区块可以用代码中的函数的形式表示

简而言之就是建立一个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.多个程序文件:

image.png
image.png

*.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

上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3