C语言中的函数

概述

  • 函数是一种可重用的代码块,用于执行特定任务或完成特定功能
  • 函数作用:对具备相同逻辑的代码进行封装,提高代码的编写效率,实现对代码的重用
  • 函数作用演示代码:
    #include <stdio.h>// 定义函数
    void func() {printf("                            _ooOoo_  \n");printf("                           o8888888o  \n");printf("                           88  .  88  \n");printf("                           (| -_- |)  \n");printf("                            O\\ = /O  \n");printf("                        ____/`---'\\____  \n");printf("                      .   ' \\| |// `.  \n");printf("                       / \\||| : |||// \\  \n");printf("                     / _||||| -:- |||||- \\  \n");printf("                       | | \\\\\\ - /// | |  \n");printf("                     | \\_| ''\\---/'' | |  \n");printf("                      \\ .-\\__ `-` ___/-. /  \n");printf("                   ___`. .' /--.--\\ `. . __  \n");printf("                ."" '< `.___\\_<|>_/___.' >'"".  \n");printf("               | | : `- \\`.;`\\ _ /`;.`/ - ` : | |  \n");printf("                 \\ \\ `-. \\_ __\\ /__ _/ .-` / /  \n");printf("         ======`-.____`-.___\\_____/___.-`____.-'======  \n");printf("                            `=---='  \n");printf("  \n");printf("         .............................................  \n");printf("                  佛祖镇楼                  BUG辟易  \n");printf("          佛曰:  \n");printf("                  写字楼里写字间,写字间里程序员;  \n");printf("                  程序人员写程序,又拿程序换酒钱。  \n");printf("                  酒醒只在网上坐,酒醉还来网下眠;  \n");printf("                  酒醉酒醒日复日,网上网下年复年。  \n");printf("                  但愿老死电脑间,不愿鞠躬老板前;  \n");printf("                  奔驰宝马贵者趣,公交自行程序员。  \n");printf("                  别人笑我忒疯癫,我笑自己命太贱;  \n");printf("                  不见满街漂亮妹,哪个归得程序员?\n");}int main() {// 函数调用func();func();func();return 0;
    }

  • 函数使用步骤
    • 定义函数
      • 理解为制作工具,工具只需要制作1次即可
    • 调用函数
      • 理解为使用工具
  • 函数分类
    • 系统函数,即库函数:这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用它们,如我们常用的打印函数printf()。
    • 自定义函数:用以解决用户的专门需要。

1.函数的使用

无参无返回值

  • 语法格式如下:
    // 函数定义
    void 函数名() {函数体
    }// 函数调用
    函数名();

    • 函数名是标识符的一种,需要遵循规则

    • 函数只需要定义一次,反复调用

    • 只定义函数, 不调用函数, 函数永远不会被执行

  • 案例需求:
    • 编写一个函数,里面实现2个数字相加,并打印相加后的结果
  • 示例代码:
    #include <stdio.h>// 函数定义
    void my_add() {// 实现2个数字相加,并打印相加后的结果int res = 1 + 2;printf("res = %d\n", res);
    }int main() {// 函数调用my_add();return 0;
    }
  • 执行流程

有参无返回值 

  • 函数参数的作用:增加函数的灵活性。
    • 可以根据需求在调用函数时, 通过参数传入不同的数据。
  • 语法格式如下:
    // 函数定义
    void 函数名(形参列表) {函数体
    }// 函数调用
    函数名(实参列表);
    • 实参和形参的关系:从左往右,一一对应。
  • 案例需求:
    • 编写一个函数,实现2个数相加,2个数通过参数传递。
  • 示例代码:
    #include <stdio.h>// 函数定义
    void my_add(int a, int b) {// 实现2个形参相加,并打印相加后的结果int res = a + b;printf("%d + %d = %d\n", a, b, res);
    }int main() {// 函数调用my_add(10, 20);return 0;
    }
  • 执行流程

有参有返回值

返回值基本语法

  • 函数返回值的作用:函数外部想使用函数内部的数据
  • 语法格式如下:
    // 函数定义
    返回类型 函数名(形参列表) {函数体return 和返回类型一致的数据(或变量);
    }// 函数调用
    和返回类型一致的变量 = 函数名(实参列表);
    • return是函数的专属关键字,只能用在函数内容
  • 案例需求:
    • 编写一个函数,实现2个数相加,2个数通过参数传递,返回累加结果给外部使用
  • 示例代码:
    #include <stdio.h>// 函数定义
    int my_add(int a, int b) {// 实现2个形参相加,并返回累加的结果int res = a + b;return res;
    }int main() {// 函数调用int temp = my_add(10, 20);printf("temp  = %d\n", temp);return 0;
    }
  • 执行流程

返回值注意点

  • return的作用是结束函数
    • 函数内,return后面的代码不会执行
  • 示例代码
    #include <stdio.h>// 函数定义
    void func() {printf("11111111111111111\n");return; // 结束函数,函数内后面代码不会执行printf("222222222222222222\n");
    }int main() {// 函数调用func();return 0;
    }

 函数的声明

  • 如果函数定义代码没有放在函数调用的前面,这时候需要先做函数的声明
  • 所谓函数声明,相当于告诉编译器,函数是有定义的,再别的地方定义,以便使编译能正常进行
  • 注意:一个函数只能被定义一次,但可以声明多次
#include <stdio.h>// 函数的声明,分号不能省略
// 函数声明的前面可以加extern关键字,也可以不加
// extern int my_add(int a, int b);
int my_add(int a, int b);
// 另一种方式,形参名可以不写
// int my_add(int, int );int main() {// 函数调用int temp = my_add(10, 20);printf("temp  = %d\n", temp);return 0;
}// 函数定义
int my_add(int a, int b) {// 实现2个形参相加,并返回累加的结果int res = a + b;return res;
}

函数案例

  • 需求:自定义一个函数,返回2个整数的最大值
  • 示例代码:
    #include <stdio.h>// 函数定义
    int my_max(int a, int b) {if (a > b) {return a;} else {return b;}
    }int main() {// 函数调用int res = my_max(100, 200);printf("res = %d\n", res);return 0;
    }

2.局部和全局变量

局部变量

  • 定义在代码块{}里面的变量称为局部变量(Local Variable)
  • 局部变量的作用域(作用范围)仅限于代码块{}, 离开该代码块{}是无效的
    • 离开代码块{}后,局部变量自动释放
  • 示例代码:
    #include <stdio.h>// 函数定义
    void my_add(int a, int b) {// a, b, res是局部变量,只能在my_add内部使用int res = a + b;
    }int main() {// 函数调用my_add(10, 20);// 函数外部无法使用函数内的局部变量,下面代码是错误的printf("%d, %d, %d\n", a, b, res);return 0;
    }

全局变量

  • 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件
  • 示例代码:
    #include <stdio.h>// 函数外定义的变量为全局变量,定义完,所有地方都能使用
    int a = 10;int main() {// 使用全局变量printf("a = %d\n", a);return 0;
    }

 多文件编程

  • 把函数声明放在头文件xxx.h中,在主函数中包含相应头文件
  • 在头文件对应的xxx.c中实现xxx.h声明的函数

防止头文件重复包含

  • 当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。
  • 为了避免同一个文件被include多次,C/C++中有两种方式。
  • 方法一:
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__// 声明语句#endif

  • 方法二:
    #pragma once// 声明语句

命令行编译程序 

gcc -g main.c func.c -o main.exe

  • -g 指定编译的文件,多个文件用空格隔开。注意:只需要编译c文件,h文件不需要加入进去;
  • -o 指定生成可执行文件的名字;

ps:命令行显示中文乱码,修改命令:chcp 65001

头文件包含的区别

  • <> 表示系统直接按系统指定的目录检索
  • "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

extern关键字

extern主要用于声明外部变量或函数,当我们将一个变量或函数声明为extern时,那么就表示该变量或函数是在其他地方定义的,我们只是在当前文件中引用它。

示例

#include <stdio.h>extern int global_val;
extern void printf_val();int main() {global_val = 100;printf_val();return 0;
}
#include <stdio.h>int global_val;void printf_val() {printf("other->global_val: %d\n", global_val);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640056.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性表的顺序存储如何设计实现?

如何存储 顺序及链式实现 计算机中的状态

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新&#xff0c;无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

javaScript3

javaScript 一.对象1.概念2.创建对象的三种方法(1).字面量创建&#xff08;利用{}&#xff09;(2)变量、属性、函数、方法的区别(3).new Object创建(4).构造函数 3.new关键字的执行过程4.遍历对象&#xff08;for..in) 二.内置对象 一.对象 1.概念 一组无序的相关属性和方法的…

前端学习之DOM编程案例:点名案例和秒表案例

点名 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点名案例</title><style>*{margin: 0;padding: 0;}</style> </head> <body><div id"container">…

声明式事务

文章目录 1.事务分类1.传统方式解决事务2.声明式事务 2.声明式事务案例1.需求分析2.解决方案分析3.数据表创建4.编写GoodsDao.java1.编写配置文件JdbcTemplate_ioc.xml2.单元测试 5.编写GoodsService.java6.配置事务管理器JdbcTemplate_ioc.xml7.进行测试 3.debug事务管理器Dat…

2. 链表

链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 链表的结构跟⽕⻋⻋厢相似&#xff0c;淡季时⻋次的⻋厢会相应减少&#xff0c;旺季时⻋次的⻋厢会额外增加⼏节。…

@NameBinding注解名称绑定过滤器/拦截器

NameBinding注解名称绑定过滤器/拦截器&#xff0c;只针对某一些资源方法执行处理逻辑 一、为什么要用名称绑定 一般情况下&#xff0c;借助Spring的过滤器或者拦截器等对Http请求或响应进行处理就能满足需求。但是在有些场景下若只需对特定的xxxResource做拦截处理&#xff0…

【ARM Trace32(劳特巴赫) 使用介绍 12.1 -- Trace32 读写 64位地址】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 读写 64位地址读 64 位地址写64位地址Trace32 读写 64位地址 在使用TRACE32进行调试时,有时需要读取或操作64位的地址,特别是在处理64位的处理器或操作系统时。以下是如何在TRACE32中读取64位地址的一般方法。 读 64 位地…

vue-element-admin vue设置动态路由 刷新页面后出现跳转404页面Bug 解决方法

做项目时遇到的这个bug&#xff0c;因为除了跳404之外也没太大影响&#xff0c;之前就一直放着没管&#xff0c;现在项目基本功能实现了&#xff0c;转头处理了一下&#xff0c;现在在这里记录一下解决方法 这个bug的具体情况是&#xff1a;设置了动态路由之后&#xff0c;不同…

FPGA - ZYNQ 基于Axi_Lite的PS和PL交互

前言 在FPGA - ZYNQ 基于EMIO的PS和PL交互中介绍了ZYNQ 中PS端和PL端交互的开发流程&#xff0c;接下来构建基于基于Axi_Lite的PS和PL交互。 开发流程 Axi_Lite从机 在FPGA - AXI4_Lite&#xff08;实现用户端与axi4_lite之间的交互逻辑&#xff09;中&#xff0c;详解介绍…

微信小程序:基于MySQL+Nodejs的汽车品牌管理系统

各位好&#xff0c;接上期&#xff0c;今天分享一个通过本地MySQLNodejs服务器实现CRUD功能的微信小程序&#xff0c;一起来看看吧~ 干货&#xff01;微信小程序通过NodeJs连接MySQL数据库https://jslhyh32.blog.csdn.net/article/details/137890154?spm1001.2014.3001.5502 …

针对窗口数量多导致窗口大小显示受限制的问题,使用滚动条控制窗口

建议&#xff1a;首先观察结果展示&#xff0c;判断是否可以满足你的需求。 目录 1. 问题分析 2. 解决方案 2.1 界面设计 2.2 生成代码 2.3 源码实现 3. 结果展示 1. 问题分析 项目需要显示的窗口数量颇多&#xff0c;主界面中&#xff0c;如果一次性显示全部窗口&#x…