【C语言】5.C语言函数(2)

文章目录

  • 7.嵌套调⽤和链式访问
    • 7.1 嵌套调⽤
    • 7.2 链式访问
  • 8.函数的声明和定义
    • 8.1 单个⽂件
    • 8.2 多个⽂件
    • 8.3 static 和 extern
      • 8.3.1 static 修饰局部变量
      • 8.3.2 static 修饰全局变量
      • 8.3.3 static 修饰函数


7.嵌套调⽤和链式访问

7.1 嵌套调⽤

嵌套调用就是函数之间的互相调用。

#include <stdio.h>void arr(){}void menu() {arr();
}int main() {menu();return 0;
}

这里 main 函数调用 menu函数。menu 函数调用 arr 函数。

函数可以嵌套调用,但是不能嵌套定义。


7.2 链式访问

所谓链式访问就是将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问。

#include <stdio.h>
int main()
{printf("%d\n", strlen("abcdef"));//链式访问 return 0;
}

把strlen的返回值直接作为printf函数的参数,链式访问 。

这个代码执行的结果是什么?

#include <stdio.h>
int main()
{printf("%d", printf("%d", printf("%d", 43)));return 0;
}

打印:

4321 

printf 函数的返回int printf ( const char * format, ... );,也就是说printf函数返回的是打印在屏幕上的字符的个数。

printf("%d", 43)这个打印43,在屏幕上打印2个字符,再返回2。

然后printf("%d", printf("%d", 43))打印2,在屏幕上打印1个字符,再返回1。

printf("%d", printf("%d", printf("%d", 43)));打印1。

所以屏幕上最终打印:4321


8.函数的声明和定义

8.1 单个⽂件

C语言编译器对源代码进行编译的时候,从第一行往下扫描的,所以函数调用之前先声明一下调用的函数。

#include <stdio.h>void menu() {}int main() {menu();return 0;
}

3-5行是函数menu的定义,第8行是函数的调用。

#include <stdio.h>int main() {menu();return 0;
}void menu() {}

如果把函数定义放在函数调用的后面就会报错。

#include <stdio.h>void menu();int main() {menu();return 0;
}void menu() {}

这里的函数定义放在了函数调用的后面,但是第3行是函数声明,所以就不会报错。

函数的调用一定要满足,先声明后使用;

函数的定义也是一种特殊的声明,所以如果函数定义放在调用之前也是可以的。


8.2 多个⽂件

一般在企业中我们写代码时候,代码可能比较多,不会将所有的代码都放在一个文件中;我们往往会根据程序的功能,将代码拆分放在多个文件中。

一般情况下,函数的声明、类型的声明放在头文件(.h)中,函数的实现是放在源文件(.c)文件中。

add.c

//函数的定义
int Add(int x, int y)
{return x+y;
}

add.h

//函数的声明
int Add(int x, int y);

test.c

#include <stdio.h>
#include "add.h"
int main()
{int a = 10;int b = 20;//函数调用int c = Add(a, b);printf("%d\n", c);return 0;
}

运行结果:

在这里插入图片描述


8.3 static 和 extern

作用域和生命周期:

作用域是限定这个名字的可用性的代码范围。

  1. 局部变量的作用域是变量所在的局部范围。

  2. 全局变量的作用域是整个工程(项目)。

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

  1. 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。

  2. 全局变量的生命周期是:整个程序的生命周期。


static 和 extern 都是C语言中的关键字:

static 是 静态的 的意思,可以用来:

  • 修饰局部变量

  • 修饰全局变量

  • 修饰函数

extern 是用来声明外部符号的。


8.3.1 static 修饰局部变量

#include <stdio.h>
void test()
{//static修饰局部变量static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for(i=0; i<5; i++){test();}return 0;
}

打印:

1 2 3 4 5 

如果把第五行的static去掉的话,就会打印:1 1 1 1 1

我们从输出结果来看,i的值有累加的效果,这是因为 static修饰局部变量改变了变量的生命周期。

生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。但是作用域不变的。

使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static修饰。


8.3.2 static 修饰全局变量

代码1:

add.c

int g_val = 2018;

test.c

#include <stdio.h>
extern int g_val;
int main(){printf("%d\n", g_val);return 0;
}

代码2:

add.c

static int g_val = 2018;

test.c

#include <stdio.h>
extern int g_val;
int main(){printf("%d\n", g_val);return 0;
}

extern 是用来声明外部符号的,如果一个全局的符号在A文件中定义的,在B文件中想使用,就可以使用 extern 进行声明,然后使用。

结果:代码1正常,代码2在编译的时候会出现链接性错误。

解释:

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

本质原因是全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以使用;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了。

使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。


8.3.3 static 修饰函数

代码1:

add.c

int Add(int x, int y)
{return x+y;
}

test.c

#include <stdio.h>
extern int Add(int x, int y);
int main()
{printf("%d\n", Add(2, 3));return 0;
}

代码2:

add.c

static int Add(int x, int y)
{return x+y;
}

test.c

#include <stdio.h>
extern int Add(int x, int y);
int main()
{printf("%d\n", Add(2, 3));return 0;
}

结果:代码1是能够正常运行的,但是代码2就出现了链接错误。

解释:

static 修饰函数和 static 修饰全局变量是一模一样的,一个函数在整个工程都可以使用,被static修饰后,只能在本文件内部使用,其他文件无法正常的链接使用了。

本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个工程中只要适当的声明就可以被使用。但是被 static 修饰后变成了内部链接属性,使得函数只能在自己所在源文件内部使用。

使用建议:一个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用 static 修饰。

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

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

相关文章

IDM Internet Download Manager 无法注册激活/注册按钮无法点击

Internet Download Manager 6.43破解版是一款功能强大的下载管理软件,这款软件能够帮助用户轻松高效地下载各种文件类型,无论你是想下载图片,视频,音乐,文档或是软件安装包,这款软件都能够帮你快速,稳定的下载,并且还支持多种线程下载和断点续传,很够很大程度的节省用户的时间和…

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来&#xff0c;Java作为一种新的编程语言&#xff0c;以其简单性、可移植性和平台无关性等优点&#xff0c;得到了广泛地应用。J2SE称…

每日复盘-20240515

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…

三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 今日任务 242.有效的字母异位词 题目 大型概括&#xff1a;map 的使用 1.题目描述-->思路&#xff1a; 给出两个string s,t; …

回顾相关性:平衡关键字和语义搜索

作者&#xff1a;来自 Elastic Kathleen DeRusso 本博客分享了最近的 Haystack 2024 演讲 “回顾相关性&#xff1a;平衡关键字和语义搜索的经验教训” 中的一些要点。 概述 相关性调整是用户搜索体验的重要组成部分。 语义搜索尤其面临着几个挑战&#xff0c;其中许多挑战是…

如何向全国各大新闻网站投稿?

在信息爆炸的时代,新闻媒体的投稿工作对于单位的信息宣传员来说,既是一项重要的职责,也是一项充满挑战的任务。作为一名信息宣传员,我负责着单位的对外信息宣传投稿工作,每个月都需要在各大媒体上发表文章,以展示单位的成果和风采。 然而,刚开始的投稿之路并不顺畅。我习惯性地…

暴力数据结构之二叉树(堆的相关知识)

1. 堆的基本了解 堆&#xff08;heap&#xff09;是计算机科学中一种特殊的数据结构&#xff0c;通常被视为一个完全二叉树&#xff0c;并且可以用数组来存储。堆的主要应用是在一组变化频繁&#xff08;增删查改的频率较高&#xff09;的数据集中查找最值。堆分为大根堆和小根…

Windows快捷命令

Windows 操作系统提供了大量的快捷命令&#xff0c;用于快速访问系统设置和管理工具。这些命令在各个版本的 Windows 中基本都适用&#xff0c;可以帮助用户快速进入各类管理工具&#xff0c;方便系统的配置和管理。如果你需要使用这些工具&#xff0c;只需按 Win R 键&#x…

【python量化交易】—— Alpha选股策略 - Qteasy自定义交易策略【附源码】

使用qteasy创建并回测Alpha选股交易策略 使用qteasy创建并回测Alpha选股交易策略策略思想第一种自定义策略设置方法&#xff0c;使用持仓数据和选股数据直接生成比例交易信号PS信号&#xff1a;第二种自定义策略设置方法&#xff0c;使用PT交易信号设置持仓目标&#xff1a;第三…

家庭主妇,宝妈在家能做什么副业有收入?

作为家庭主妇和宝妈&#xff0c;您可以考虑以下副业来增加收入 1. 在家兼职 您可以在家里做一些兼职工作&#xff0c;如数据输入、文案撰写、翻译、客服等。可以通过在线平台或社交媒体寻找这些机会。 2. 做任务 目前网上最流行的就是做任务&#xff0c;因为简单无门槛&…

图文教程 | 2024年最新VSCode下载和安装教程c/c++环境配置,json文件详解,实用插件分享

前言 &#x1f4e2;博客主页&#xff1a;程序源⠀-CSDN博客 &#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01; 由于重装电脑&#xff0c;需要重新安装VsCode&#xff0c;记录安装配置过程。 一、VSCode下载 官网地址&#xff1a; Vis…

Vue3+ts(day06:路由)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…