C语言入门Day_21 函数的使用

news2025/1/15 13:30:36

目录

前言:

1.变量作用域

2.代码执行顺序 

3.易错点

4.思维导图


 

前言:

我们是先定义函数,再调用函数。完成了函数的定义以后,我们就可以开始调用函数了,让我们来回顾一下:

调用函数分为两部分,一部分是函数名,一部分是函数参数。

 

我们定义了一个只有一个参数的函数AddThree(),然后我们调用一下它:

int a=10;
int b;
b=AddThree(a);
printf("%d\n",n);

1.函数名   AddThree

2.函数参数,整型变量   a

 

以及有两个参数的函数AddTwoNumber()

int num_c;
num_c = AddTwoNumber(10, 20);
printf("%d\n", num_c);

1.函数名   AddTwoNumber

2.第一个函数参数,整型常量   10

3.第二个函数参数,整型常量   20

4.分隔两个参数的逗号  

 

对于同一个函数,我们可以使用不同的参数来调用它,这样就会得到不同的返回值。

比如下面的两次调用,分别得到的是不同的返回值,一次是30,一次是140。

这也是函数的一个特性,函数定义只有一次,函数调用可以有很多次。

 

1.变量作用域

1.1

在函数定义中,我们有时候会定义一些变量,这些变量只能在函数内部“生效”,函数外部的代码无法直接访问(修改,读取)这些变量。

同样的,函数外部定义的变量,我们也无法在函数内部用代码直接去访问(读取和修改)它们。

 

1.2

这种机制叫做变量的作用域,也就是变量“生效”的地方,不同地方定义的变量,作用域各有不同,在变量作用域以外的地方访问它,代码会报错。

例如:

int AddThree(int num_a)
{
    int num_b;
    num_b = num_a + 3;
    return num_b;
}
int main(){
    int num_c = 10;
    int num_d;
    num_d = AddThree(num_c);
    printf("%d\n", num_d);
    printf("%d\n", num_b);
}

1.函数内部定义的变量   int num_b

2.函数外部定义的变量   int num_c = 10   int num_d

3.函数外部的代码访问函数外部的变量num_d,能够正常访问   printf("%d\n", num_d)

4.函数外部的代码访问函数内部的变量num_b,无法正常访问   printf("%d\n", num_b)

 

1.3

需要注意的是,这个函数的外部,包括其他函数,比如我们在函数A中定义的变量,就无法在函数B中访问;以及在函数B中定义的变量,也无法在函数A中访问。

 

我们可以看到不同的变量的不同作用域,这是函数内部和外部的区别

90c5ee7afb8a45eebfbb2c49f8f3eaa7.png

 

这是两个函数之间的区别

3ca6cc0705e944b6bccdf40fbe3fd89d.png

 

2.代码执行顺序 

2.1

之前我们已经学过了三种代码执行顺序了他们分别是:

顺序执行——从上到下顺序执行。

判断语句如(if,if-else)的执行顺序——判断执行,又叫判断分支,或者选择执行。

循环(for循环,while循环)涉及的代码执行顺序——循环执行。

69e6dee457444fe5bfb2bcc5dce421ff.png

 

在函数定义和调用的代码中,我们也能感受到,它的执行顺序和上面三种都不太一样。

这里就涉及到新的代码执行顺序——跳转执行:

d363a6f4ec7347de9d279b761f2032b9.png

 

2.2 

我们知道所有C程序的代码执行都是从main函数开始的,然后默认从上往下执行。 

比如这样:

int main(){
    int num_a = 5;
    float flo_b = 10.0;
    char cha_c = 'a';
    printf("%d\n", num_a);
    printf("%f\n", flo_b);
    printf("%c\n", cha_c);
}

 

1.C语言启动,进入main函数      int main() {}

2.顺序执行,定义整形变量         int num_a = 5

3.顺序执行,定义浮点型变量     float flo_b = 10.0

4.顺序执行,定义字符型变量      char cha_c = 'a'

5.顺序执行,打印整形变量          printf("%d\n", num_a)

6.顺序执行,打印浮点型变量       printf("%f\n", flo_b)

7.顺序执行,打印字符型变量       printf("%c\n", cha_c)

 

当我们调用函数的时候,代码执行顺序首先会从调用函数的地方跳转到函数定义的内部;

然后再函数内部执行,最后又从return的地方返回到函数外部调用函数的地方。

 

 这里面就涉及到一个跳转到函数定义内部的过程,这就是跳转执行的顺序。

 

2.3

我们来看看一个跳转执行的代码顺序:

int AddThree(int num_a)
{
    int num_b;
    num_b = num_a + 3;
    return num_b;
}
int main(){
    int num_c = 10;
    int num_d;
    num_d = AddThree(num_c);
    printf("%d\n", num_d);
}

 1.从main函数开始   int main(){

2.顺序执行,定义一个整型变量   int num_c = 10

3.顺序执行,定义一个整型变量   int num_d

4.顺序执行到函数调用,准备跳转到函数内部   AddThree(num_c)

5.跳转执行,到函数内部   int AddThree(int num_a)

 

int AddThree(int num_a)
{
    int num_b;
    num_b = num_a + 3;
    return num_b;
}
int main(){
    int num_c = 10;
    int num_d;
    num_d = AddThree(num_c);
    printf("%d\n", num_d);
}

 

6.顺序执行函数内部的代码   int num_b

7.继续顺序执行   num_b = num_a + 3

8.函数执行完毕,返回值到函数外部   return num_b

9.回到函数调用处   num_d = AddThree(num_c)

10.继续顺序执行   printf("%d\n", num_d)

 

2.4

我们来梳理一下跳转执行的顺序:

1、调用函数

2、函数定义的内部

3、return返回到函数调用处

 

如果一个函数的返回类型是void,以及函数体内部没有关键字return。这时候函数内部,执行完所有代码以后,仍然会跳转到调用函数的地方,只不过没有返回值。
 

3.易错点

34bae726364d4c7fa6afe17001835383.png

在C语言中,使用一对花括号 {} 可以创建一个块级作用域。在块级作用域内定义的变量只在该作用域内可见。

注意,块级作用域可以嵌套:

内部作用域可以访问外部作用域中的变量,

而外部作用域无法访问内部作用域中的变量。

 

4.思维导图

9ce997b61d6c41a6a2085041af54ba4f.png

 

最后我想说的是:

 在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。

 

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

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

相关文章

1131. 绝对值表达式的最大值

1131. 绝对值表达式的最大值 原题链接:完成情况:解题思路:求方向一次遍历两度统计 参考代码:求方向一次遍历两度统计 原题链接: 1131. 绝对值表达式的最大值 https://leetcode.cn/problems/maximum-of-absolute-val…

网络安全深入学习第二课——热门框架漏洞(RCE—Thinkphp5.0.23 代码执行)

文章目录 一、什么是框架?二、导致框架漏洞原因二、使用步骤三、ThinkPHP介绍四、Thinkphp框架特征五、Thinkphp5.0.23 远程代码执行1、漏洞影响范围2、漏洞成因 六、POC数据包Windows下的Linux下的 七、漏洞手工复现1、先Burp抓包,把抓到的请求包发送到…

【AI语言大模型】文心一言功能使用介绍

一、前言 文心一言是一个知识增强的大语言模型,基于飞桨深度学习平台和文心知识增强大模型,持续从海量数据和大规模知识中融合学习具备知识增强、检索增强和对话增强的技术特色。 最近收到百度旗下产品【文心一言】的产品,抱着试一试的心态体验了一下,整体感觉:还行! 二…

自动化测试API【软件测试】

自动化测试 selenium 1. 为什么使用selenium? 开源免费支持多浏览器支持多系统支持多语言编程提供了丰富的web自动化测试API 2. API 查找页面元素 find Element() find Elements() 元素定位的方式 xpath selector 通常情况下,不需要手动来编写xpath…

Learn Prompt-经验法则

还记得我们在“基础用法”当中提到的三个经验法则吗? 尝试提示的多种表述以获得最佳结果使用清晰简短的提示,避免不必要的词语减少不精确的描述 现在经过了几页的学习,我认为是时候引入一些新的原则了。 3. 一个话题对应一个chat​ ChatG…

Kafka开篇

前言 从本篇开始对个人Kafka学习做一个总结, 目标有这么几个。 从概念架构角度, 对消息中间件形成概要认知;从使用角度, 掌握其常见用法;从性能角度, 探究其高性能实现机制; 消息中间件的用途 从消息生产和消费的角度, 平衡消费者和消费者的速率差。基于该点可以做到削峰填…

白炽灯对新生儿视力有影响吗?推荐专业的儿童台灯

大家都知道婴儿还在成长发育的重要阶段,身体各方面都是比较脆弱的,对外界事务的感知也很敏感,一点点的刺激都会影响的婴儿。而白炽灯是否适合婴儿使用这个问题,我的建议是尽量不要用白炽灯。 因为白炽灯光线不是很柔和&#xff0c…

周易算卦流程c++实现

代码 #include<iostream> using namespace std; #include<vector> #include<cstdlib> #include<ctime> #include<Windows.h>int huaYiXiangLiang(int all, int& left) {Sleep(3000);srand(time(0));left rand() % all 1;while (true) {if…

许可分析 license分析 第十二章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证的分配和使用权限&#xff1a;制定…

01Spring的Ioc思想和依赖注入手段(DI)

传统方式创建对象的缺陷 连接MySQL实现登录功能 控制层UserController public class UserController {//多态,半面向接口编程private UserService userService new UserServiceImpl();public void login(){String username "admin";String password "1234…

基于 Zookeeper 实现分布式锁

文章目录 前言声明前置知识分布式锁设计原则Zookeeper 分布式锁实现Curator框架实现分布式锁总结 前言 在分布式系统中&#xff0c;确保数据的一致性和避免冲突是一个核心问题&#xff0c;通常我们通过分布式锁来解决&#xff0c;分布式锁本质是一种同步机制&#xff0c;用于控…

【AI】机器学习——支持向量机(线性模型)

支持向量机是一种二分类算法&#xff0c;通过在高维空间中构建超平面实现对样本的分类 文章目录 5.1 SVM概述5.1.1 分类 5.2 线性可分SVM5.2.1 线性可分SVM基本思想5.2.2 策略函数间隔几何间隔硬间隔最大化 5.2.3 原始算法支持向量 5.2.4 对偶形式算法1. 构造并求解对偶问题2. …

【小沐学CAD】嵌入式UI开发工具:GL Studio

文章目录 1、简介2、软件功能3、应用行业3.1 航空3.2 汽车3.3 防御3.4 工业3.5 电力与能源3.6 医疗3.7 空间3.8 科技 结语 1、简介 https://disti.com/gl-studio/ DiSTI 是 HMI 软件、虚拟驾驶舱、仪表、信息娱乐、集群显示器和嵌入式 UI 解决方案的领先提供商。 而它的GL Stu…

kubernetes部署(kubeadmin)

文章目录 1.环境准备2. 安装dokcer3.部署cri-docker4.各个节点安装kubeadm等5.整合kubelet和cri-dockerd配置cri-dockerd配置kubelet 6.初始化集群 1.环境准备 环境和软件版本 OS : ubuntu 20.04 container runtime: docker CE 20.10.22 kubernetes 1.24.17 CRI&#xff1a;cr…

atoi函数

介绍&#xff1a; 头文件: <stdlib.h> 此函数的功能是将数字字符的字符串转化为字面上的整型返回。 例如&#xff1a; char arr1[] "-12"; char arr2[] "12"; char arr3[] " -12"; char arr4[] "-12a";使用atoi 我们…

Postman的高级用法一:重新认识postman核心模块

本请求示例来自于免费天气API&#xff1a; 实况天气接口API开发指南 未来一天天气预报api - 天气API 关于Postman的核心模块 全局变量请求接口请求体预处理脚本 类似beforeTest&#xff0c;在发起请求前的预执行逻辑&#xff0c;通常是生成一些动态变量值 测试用例模块 测试者…

RK3399平台开发系列讲解(入门篇)VIM的基础命令

🚀返回专栏总目录 文章目录 一、Vim 命令速查二、其他命令三、Vim模式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 一、Vim 命令速查 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步…

MFC使用MScomm32.ocx控件实现串口通信

文章目录 建立项目添加MSCOMM控件变量串口的打开和关闭串口发送和接收数据数据接收数据发送16进制数据的收发转换函数数据发送数据接收项目下载地址首先电脑应该有MSCOMM32.OCX并注册 建立项目 使用VS2005新建一个基于对话框的MFC项,在资源视图,右键窗体,插入ActiveX控件,…

基于Questasim的SystemVerilog DPI使用流程

1. 前言 DPI是Direct Programming Interface的缩写&#xff0c;它提供了SystemVerilog与其它编程语言(特别是C语言)交互的接口。它允许编程人员轻松地从SystemVerilog调用C函数&#xff0c;且在C函数也可以调用Systemverilog的函数。 DPI极大地方便了使用现有的C代码&#xf…

SpaceX预计到2022年Starlink用户将达到2000万,但最终达到了100万

SpaceX的Starlink部门还没有接近实现客户和收入的预测&#xff0c;该公司在建立卫星网络之前与投资者分享了这一点华尔街日报报道今天出版。 据报道&#xff0c;2015年的一份题为“SpaceX用来从投资者那里筹集资金”的报告预计&#xff0c;到2022年&#xff0c;Starlink的订户…