05-函数

news2024/9/20 15:58:10

函数的定义

函数名

函数名的后面有个圆换号(),代表这个为函数,不是普通的变量名。

形参

在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,简称形参,表示它们并不是实际存在的数据,所以,形参里的变量不能赋值。

void max(int a = 10, int b = 20) // error, 形参不能赋值
{
}

函数的调用

main()为自动被调用的主函数,无需人为调用。一个C程序里有且仅有一个main()函数。

函数的声明

如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)不在同一文件中,或者函数定义的位置在主调函数之后,则必须在调用此函数之前对被调用的函数作声明。

所谓函数声明,就是在函数尚在未定义的情况下,事先将该函数的有关信息通知编译系统,相当于告诉编译器,函数在后面定义,以便使编译能正常进行。

注意:一个函数只能被定义一次,但可以声明多次

#include<stdio.h>

/*
* test()定义在main()方法之后,
* 如果此处不作声明,将编译失败。
*/
void test(int a); // 函数的声明,分号不能省略
//void test(int);//另一种声明方式

int main() {
	test(10);
	return 0;
}

void test(int a) {
	printf("这里是test方法, 收到的参数是%d\n", a);
}

函数定义和声明的区别:
1)定义是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。
2)声明的作用则是把函数的名字、返回值类型以及形参的个数、类型和顺序(注意,不包括函数体)通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。

变量的声明与定义的区别可以忽略不计。
变量的声明:只是通知编译器该变量占用了一个变量名,但不要给变量分配内存。其它变量不可以起和它一样的名字。
变量的定义:通知编译器该变量占用了一个变量名并且已经分配给它一块内存了。
被声明的变量一旦被赋值了,就相当于被定义了。

int i;//这是定义变量
extern int i;//这是声明变量

main函数与exit函数

在main函数中调用exit和return结果是一样的,但在子函数中调用return只是代表子函数终止了,在子函数中调用exit,那么程序终止。

#include<stdio.h>

void test(int a);

int main() {
	test(10);
	printf("test方法执行结束了");//(1)
	return 0;
}

void test(int a) {
	printf("这里是test方法, 收到的参数是%d\n", a);
	exit(0);//此处终止了程序,所以代码(1)没有被执行
}

多文件(分文件)编程

分文件编程

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

int max(int, int);
//extern int max(int, int);//关键字extern可以省略
//这是max.c

int max(int a, int b) {
	return a > b ? a : b;
}
//这是main.c

#include<stdio.h>
#include"max.h"

int main() {
	int a = 1;
	int b = 2;
	int c = max(a, b);
	printf("a = %d, b = %d, 二者最大值为%d\n", a, b, c);
	return 0;
}

防止头文件重复包含

当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含。

a.h包含b.h

#include"b.h"

b.h包含a.h

#include"a.h"

main.c 中使用其中头文件

#include "a.h"

int main()
{
	return 0;
}

上面的代码编译失败:
在这里插入图片描述

为了避免同一个文件被include多次,C/C++中有两种方式,一种是 #ifndef 方式,一种是 #pragma once 方式。

方法一:

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__

// 声明语句

#endif

方法二:

#pragma once

// 声明语句

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

.Net6 使用aspose.cells23.5.0

一、测试代码 internal class Program { static void Main(string[] args) { WorkbookDesigner wb new WorkbookDesigner(new Workbook()); var style new CellsFactory().CreateStyle(); style.Borders.SetColor(C…

LED显示屏控制系统分类

LED显示屏的控制系统可以根据不同的特点和功能进行分类。以下是常见的LED显示屏控制系统分类&#xff1a; 同步控制系统&#xff1a;同步控制系统通过传输同步信号来控制LED显示屏&#xff0c;确保多个显示屏之间的内容同步显示。同步控制系统适用于大型LED显示屏&#xff0c;如…

通过chatGPT学习:kubernetes中的list-watch机制介绍

1、 请解释一下&#xff0c;在kubernetes中的list-watch机制&#xff1f; Kubernetes是一个开源的容器编排和管理系统&#xff0c;它可以有效地管理大规模的容器化应用程序。 在Kubernetes中&#xff0c;list-watch机制是一种重要的机制&#xff0c;用于监视资源的变化并及时…

k8s系列(六)——Service服务发现

Service概述 为什么要使用Service Kubernetes Pod是平凡的&#xff0c;由Deployment等控制器管理的Pod对象都是有生命周期的&#xff0c;它们会被创建&#xff0c;也会意外挂掉。虽然它们可以由控制器自动重建或者滚动更新&#xff0c;但是重建或更新之后的Pod对象的IP地址等都…

什么是单点登录

一、什么是单点登录&#xff1f; 单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称SSO&#xff09;。 在初学/以前的时候&#xff0c;一般我们就单系统&#xff0c;所有的功能都在同一个系统上。 后来&#xff0c;我们为了合理利用资源和降低耦合性&#xff…

SmartKnob移植ESP32和STM32

目录 说明一、SmartKnob简介二、SmartKnob移植ESP322.1、电机部分2.2、增加LED和按键2.2.1、LED闪烁2.2.2、按键2.2.2.1、应变片方案2.2.2.2、MT6701方案2.2.2.3、实体按键 2.3、增加氛围灯2.3.1、WS28122.3.2、FastLED 库2.3.3、Freenove_WS2812_Lib_for_ESP32 库 三、SmartKn…

[ACTF新生赛2020]fungame 题解

开辟了一块内存空间&#xff0c;然后有两个函数&#xff0c;进入第一个跟一下 将输入的字符串进行异或&#xff0c;后比较&#xff0c; 解一下 y1[0x23,0x61,0x3e,0x69,0x54,0x41,0x18,0x4d,0x6e,0x3b,0x65,0x53,0x30,0x79,0x45,0x5b] y2[0x71,0x04,0x61,0x58,0x27,0x1e,0x4b,…

vue项目中main.js使用方法详解

目录 一、main.js文件解析 二、Vue.prototype的作用与使用 三、Vue.use的作用以及什么时候使用 1、组件 World 组件 2、定义一个index.js文件&#xff0c;并引入 两组件 &#xff0c;并导出&#xff1a; 3、在 main.js 中引入index.js 4、全局使用(不用引入直接可以使用…

ESD静电监控仪如何提示设备阻值异常

在电子厂的生产过程中&#xff0c;静电是一个不可避免的问题。静电的存在会给电子产品的生产带来很多危害&#xff0c;因此&#xff0c;防静电措施是必不可少的。静电会对电子元器件的性能产生影响。电子元器件对静电非常敏感&#xff0c;即使是微小的静电电荷也可能会对元器件…

功能测试的6中方法你知道多少

对于测试人员而言&#xff0c;软件产品每个按钮的功能是否准确&#xff0c;链接是否能正常跳转&#xff0c;搜索时会不会出现页面错误&#xff0c;验证并减少这些软件使用过程中可能出现的各种小问题都是功能测试的内容。而对于用户而言&#xff0c;功能能否正常执行都是非常直…

新来了个23岁的测试员,本以为是菜鸡,没想到是扮猪吃老虎

咋这金3银4都完了还有人来面试的&#xff0c;一看简历&#xff0c;嘿&#xff1f;23岁&#xff0c;这不刚毕业的小毛孩子嘛&#xff0c;结果没想到人家上来就把现有的项目都测了一遍&#xff0c;找出一堆bug&#xff0c;给公司节解决了不少的麻烦&#xff0c;这种“王炸”打法&…

webpack手动配置一个vue3项目

感觉学webpack和vite比登天还难啊&#xff0c;所以只是止步于能用和一些基础的配置比如proxy等等。因为自己是看培训班视频入的门&#xff0c;有些东西不是非常清楚(话说清楚了不还是个前端)&#xff0c;关于如何拓展自己的职业宽度&#xff0c;每个人有自己的想法&#xff0c;…

Qt消息的理解

分析 信号是什么&#xff0c;信号与槽(Signals&Slot)是QT编程的基础&#xff0c;也是Qt的一大创新。因为有了信号与槽的编程机制&#xff0c;在Qt中处理界面各个组件的交互操作变得更加直观和简单。 信号(signal)就是特定下被发射的事件。 槽就是对信号响应的函数&#xf…

如何解决MySQL limit深分页问题

1、limit深分页为什么会变慢&#xff1f; 先看下表结构&#xff1a; CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键Id,name varchar(255) DEFAULT NULL COMMENT 账户名,balance int(11) DEFAULT NULL COMMENT 余额,create_time datetime NOT NULL …

机器视觉是如何实现激光焊缝追踪系统

随着工业科学技术的发展&#xff0c;机器更换的地方越来越多&#xff0c;现在一些焊接工作交给了机器&#xff0c;其核心技术是&#xff1a; 激光束追踪传感器通过计算&#xff0c;将激光放大后投影到被测量物的表面&#xff0c;其反射光透过高质量的光学系统并投影到成像矩阵…

二叉堆讲解

二叉堆讲解 大顶堆和小顶堆 从二叉堆的结构说起&#xff0c;它是一棵二叉树&#xff0c;并且是完全二叉树&#xff0c;每个结点中存有一个元素&#xff08;或者说&#xff0c;有个权值&#xff09;。 堆性质&#xff1a;父亲的权值不小于儿子的权值&#xff08;大根堆&#x…

AI制作视频——mov2mov以及inpaint

背景 AI制作视频的几种思路 1.从零开始生成&#xff1a;清华的cogview&#xff0c;runway gen-1、gen-2&#xff0c;微软的女娲 这个思路&#xff0c;就是认为可以通过文字描述的方式把视频画面描述出来&#xff0c;通过对文本-视频帧内容-视频内容的数据对的平行语料的学习…

微软限制我们使用Windows系统了,怎么办?

正如中国工程院院士倪光南所说&#xff0c;操作系统的成功与否&#xff0c;关键在于生态系统&#xff0c;需要搭建起完整的产业链上各个主体共生的生态体系。 当前我国国产操作系统市场发展很快&#xff0c;相比技术和市场突破&#xff0c;真正需要解决的问题是如何把生态建好…

Jvm-08a.类加载器

类与类加载器 对于任意一个类&#xff0c;都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性&#xff0c;每一个类加载器&#xff0c;都拥有一个独立的类名称空间。 通俗的讲就是比较两个类是否"相等"&#xff0c;只有在这两个类是由同一…

设计模式实战 | 迭代器模式 | 分词器

1、场景 假设有下面这样一个字符串属性&#xff0c; 代表着属性逐级调用&#xff0c; 我们需要解析出每一个字段属性方便我们后续进行业务处理。 String properties "school.teacher[语文].student[3].user[4].english.score";2、传统写法 遍历该属性字符串然后不…