【c语言】函数的基本概念 | 函数堆栈调用原理

news2024/10/5 15:30:48

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ  

目录

一、函数的含义与作用

二、函数的基本结构

函数的前置声明 

完整的函数结构 

函数的返回值

三、函数的调用执行原理

 函数的调用堆栈 

 函数调用堆栈更深入的理解:


一、函数的含义与作用

在程序中,函数就是封装了一段流程结构的代码,是一个描述与使用逻辑功能的代码结构。

利用函数封装重构后的代码结构可以增强代码的可维护性、可阅读性、可复用性等,并且利于结构化、模块化的程序设计与分工协作。

函数就是对流程结构的封装!!! 

二、函数的基本结构

函数由函数名、参数、内部的流程结构等组成。函数被用于调用和执行。在main主函数中,必须调用某自定义函数才能执行该函数。

一个简单的函数例子:

//函数:判断一个人是否可以结婚
//函数就是一段流程结构的封装
int enabledMarry( int sex,int age)
{
    if(sex)//逻辑真非0 代表男
    {
        return age>=22;
    }
    else
    {
        return age>=20;
    }
}
int main()
{
    //判断 男 30岁 是否能够结婚
    printf("%d\n", enabledMarry(1,30));//函数的调用状态
    return 0;
}

函数的前置声明 

声明状态一般放在main函数外面,也就是全局位置。

函数使用的流程:先声明,再调用最后再定义。 

如果enabledMarry函数在main函数后面,即调用在前,定义在后,则需要在调用前做一下函数的前置声

int enabledMarry( int sex,int age);//函数声明状态: 写在调用之前,只写函数名,不写实现过程

int main()
{
    //判断 男 30岁 是否能够结婚
    printf("%d\n", enabledMarry(1,30));//函数的调用状态
    return 0;
}
int enabledMarry( int sex,int age)
{
    if(sex)//逻辑真非0 代表男
    {
        return age>=22;
    }
    else
    {
        return age>=20;
    }
}

完整的函数结构 

函数的返回值

void fun(void)
    //void 代表空 放在返回值位置上,说明此函数执行完不返回任何值
    //void 放在参数位置上则显示说明无形式参数
{
    return; //返回值为void 也可以不写return
}
int fun(void)
{
    return 3;  //return的结果要么和返回类型int一致,要么能自动类型转换之。
}
void fun()
{
    int a=1;
    return ;  //return会终止函数的本次调用,后面的代码不再执行!
    a++;      //此处代码不会被执行
}
void fun()
{
    int a=3;
    if(a<3)
    {
        return; //return执行会终止函数的本次调用
    }
    a++;
}

三、函数的调用执行原理

函数的调用堆栈 

 函数的执行原理:调用时执行,执行完消失!!!

函数在调用时,会经过函数调用栈!!!先进后出

调用完一次之后消失,等待再次调用 

#include <stdio.h>
int add(int a, int b)
{
	int sum = 0;
	sum = a + b;
	return sum;
}
int main()
{
	int a = add(3, 4);
	printf("%d\n", a);
	return 0;
}

 调用add函数时:

 调用完add函数,从调用堆栈退出:

 函数调用堆栈更深入的理解:

#include <stdio.h>
int add(int a, int b)
{
	int sum = 0;
	sum = a + b;
	return sum;
}
int main()
{

	int x = 10, y = 20;

	printf("%d %d\n", add(x, y), add(++x, ++y)); 

	return 0;
}

运行结果: 

add(x, y)与add(++x, ++y) 结果相同

出现这种情况的原因:

在 printf("%d %d\n", add(x, y), add(++x, ++y)); 这条语句中,由于add函数通过函数堆栈

add(x, y)先进入堆栈中,add(++x, ++y)后进入堆栈但是先执行,而add(x, y)后输出执行

因此++x和++y先自增,就会出现这种结果,而不是正常的语句从左向右依次执行

函数的调用经过堆栈,先进后出!!!

 

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

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

相关文章

【通知】CSDN学院:<华为流程体系课程> 正式上线啦!

目录 前言 适用人群 你将收获 课程介绍 前言 经过两个月的准备和短视频测试&#xff0c;这门介绍华为流程体系的课程就正式上线了。 虽然由于公开的原因&#xff0c;华为的发展受到了一定程度的影响&#xff0c;但是丝毫不妨碍企业、以及一些个人对学习华为的热情。 原因…

Java内存模型详解

Java内存模型 Java内存模型(Java Memory Model)是Java虚拟机规范定义的&#xff0c;用于屏蔽因不同程序/硬件/操作系统上内存访问的差异&#xff0c;确保程序运行与设计一致&#xff0c;Java内存模型定义了Java虚拟机在计算机内存中的工作方式&#xff0c;确定了在共享内存系统…

通过SSH实现Linux与Windows之间的文件互传

目录 一 序言 二 准备工作 三 Windows端操作命令&#xff0c;实现文件互传 四 Linux端操作命令&#xff0c;实现文件互传 五 总结 一 序言 Linux和Linux以及Windows和Windows之间的文件共享互传&#xff0c;大家应该接触的都比较多&#xff0c;无非就是两种方式&#xff…

【C++类和对象】类和对象(上) {初识面向对象,类的引入,类的定义,类的访问限定符,封装,类的作用域,类的实例化,类对象模型,this指针}

一、面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。…

1.2和1.3、GCC

1.2和1.3、GCC 1.2和1.3、GCC1.2.1、什么是GCC1.2.2、编程语言的发展1.2.3、GCC工作流程1.2.4、gcc和g的区别1.2.5、GCC常用参数选项实际操作①接下来进行预处理操作&#xff08;test.c为需要预处理的源代码&#xff0c;test.i为要生成的目标代码&#xff09;②汇编操作&#x…

iOS--SDWebImage源码

文章目录 前言它提供了UIImageView的一个分类&#xff0c;支持从网路上下载且缓存图片&#xff0c;并设置图片到对应的UIImageView控件或者UIButton控件。 SDWebImage简介官方图解主序列图&#xff08;Main Sequence Disagram&#xff09;顶层API图&#xff08;Top Level API D…

XLA IR:HLO、LHLO、MHLO和LMHLO

XLA IR&#xff1a;HLO、LHLO、MHLO和LMHLO HLOLHLOMHLOLMHLOXLA IR 总结HLO->LMHLO xla基本编译流程如下&#xff1a; HLO Optimization: 硬件无关优化和硬件相关优化LHLO Codegen: 算子向量化和llvmir的生成HLO&LHLO是XLA-HLO&#xff1b;MHLO&LMHLO是MLIR-HLO&…

队列的基本操作(C语言链表实现)初始化,入队,出队,销毁,读取数据

文章目录 前言一、队列基本变量的了解二、队列的基本操作2.1队列的初始化&#xff08;QueueInit&#xff09;2.2入队&#xff08;QueuePush&#xff09;2.3判断是否为空队&#xff08;QueueEmpty&#xff09;2.4出队&#xff08;QueuePop&#xff09;2.5队列的队头数据&#xf…

分享BigDecimal金额计算的4种方式

基本介绍 金额计算这块通常都是基于2位小数的四舍五入&#xff0c;如果是自己的系统内部功能金额位数一般都是固定的&#xff0c;在正常的加减乘除运算逻辑都是保留同样位数的&#xff0c;但是乘法和除法相对比较特殊&#xff0c;在计算小数的部分可能会计算出更多位数的小数点…

【微服务】搭建Consul集群服务和Consul配置中心

文章目录 一、传统配置文件的弊端二、微服务配置中心三、主流的配置中心四、Consul 配置操作1.添加配置信息2.获取配置信息 五、单点服务器Consul集群 一、传统配置文件的弊端 静态化配置&#xff0c;例如env文件配置文件无法区分环境配置文件过于分散历史版本无法查看 配置中…

5.5、线程池同步机制类封装及线程池实现

代码地址 5.5、线程池同步机制类封装及线程池实现 1.线程池2.代码实现①锁Ⅰ、locker.hⅡ、locker.cpp ②条件变量Ⅰ、cond.hⅡ、cond.cpp ③信号量Ⅰ、sem.hⅡ、sem.cpp ④线程池Ⅰ、threadpool.hⅡ、threadpool.cpp 1.线程池 线程池是由服务器预先创建的一组子线程&#xf…

行为识别预警系统 opencv

行为识别预警系统通过pythonopencv网络模型技术&#xff0c;行为识别预警系统对现场画面中人的行为进行智能分析&#xff0c;发现违规行为自动抓拍告警&#xff0c;同步回传后台存档提醒值班人员及时处理。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个…

CVE漏洞复现-CVE-2019-5736 Docker逃逸

CVE-2019-5736 Docker逃逸 Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有…

JAVA实现AES加密、解密附代码

大家好&#xff0c;今天我们一起来学习 Java中的加密解密技术&#xff0c; java是一门面向对象的语言&#xff0c;使用它的开发人员都是非常聪明的人&#xff0c;他们对数据的安全性要求很高。在实际的应用中&#xff0c;我们都需要对数据进行加密、解密处理&#xff0c;这在 j…

【数据结构】第十三站:排序(上)

本文目录 一、排序概念二、插入排序1.插入排序的基本思想2.算法实现3.时间复杂度分析 三、希尔排序1. 希尔排序的思想2.希尔排序的代码实现3.希尔排序和插入排序的性能测试比较4.希尔排序的时间复杂度 四、直接选择排序1.基本思想2.直接选择排序的步骤3.直接选择排序的代码实现…

接口自动化测试用例如何设计?

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

音视频开发开发核心知识+小白入门必看基础知识

音视频开发是一个广泛的领域&#xff0c;它涉及到多个技术领域&#xff0c;包括音频编解码、视频编解码、媒体容器格式、流媒体传输、音视频处理等。以下是音视频开发的一些基础知识&#xff1a; 音频编解码器&#xff1a;音频编解码器是将数字音频信号编码成一种压缩格式&…

什么原因会导致香港轻量云服务器运行缓慢?

对于外贸企业主来说&#xff0c;想要为自己的网站选择一个可靠的主机供应商&#xff0c;并考虑使用香港轻量云服务器&#xff0c;则本文是必读的。本文将探讨租用香港轻量云服务器后遇到的运行缓慢的问题。下文这些因素被视为其中的主要因素。仔细分析它们中的每一个将帮助您确…

华为OD机试真题(Java),5键键盘的输出(100%通过+复盘思路)

一、题目描述 有一个特殊的5键键盘&#xff0c;上面有a&#xff0c;ctrl-c&#xff0c;ctrl-x&#xff0c;ctrl-v&#xff0c;ctrl-a五个键。 a键在屏幕上输出一个字母a&#xff1b;ctrl-c将当前选择的字母复制到剪贴板&#xff1b;ctrl-x将当前选择的字母复制到剪贴板&#…

python 打包新方案

首先是打包一个最简单的python 代码使用 pyinstaller import os #直接读取文件获得python.exe 路径 # 待执行python路径 with open("path_run.txt","r",encoding"utf-8") as f:python_exe,pyf.readlines() os.system("{} {}".format(p…