1.局部变量的作用域是变量所在的局部范围。
2.全局变量的作用域是整个工程。
3.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
4.全局变量的生命周期是:整个程序的生命周期。
由于笔者在大学学习期间,对函数部分的理解较浅,尤其是函数递归部分,所以本文会根据B站鹏哥C语言的视频对函数部分内容有一个大致介绍,并且会将函数递归部分单独写一篇文章。
一.函数链式访问
e.g.
printf("%d",printf("%d",printf("%d",43)));
printf的返回值为打印字节个数,那么“43”打印了两个字符,因此printf("%d",printf("%d",43))就打印2,所以在本例中最后打印的是4321。
由于这样看起来像是链条式地访问printf函数,因此称为函数的链式访问。
tip:%2d,两位右对齐,2*2= 4;%-2,两位左对齐,2*2=4 ;%.2f即为保留两位小数(必须要是实型打印)。
二.函数类型
函数的类型定义应该与返回值相同
int Add(int x, int y)
{
printf("hehe\n")
}
上面的代码在一些编译器上返回的是函数中执行过程中最后一条指令执行的结果。
由于printf了“hehe”与回车,总计5个字符,因此返回了5。
三.实践工作
在代码实践时,一般会将一个大项目分成几个模块,汇总起来实现。
在xxx.c文件中实现一个功能后,最好要有xxx.h文件来声明此功能(需要加上#pragma once),并在项目主文件中加上#include"xxx.h"。原因:为了代码的保密性与引用时的便捷度(项目主文件只需要引用一次xxx.h,无需一个个函数引用);并且因为在把xxx.h卖给其他公司时,可以把xxx.c中的内容编译成静态库,此时xxx.c中的代码会是一串乱码,那么别人就无法进行抄袭。
将xxx.c内容编译成静态库的方法:
在完成了add.c功能,并在add.h文件中声明了add.c中的所有函数,那么打开add(人为命名)功能项目的属性,并将配置类型改成改为静态库类型,如下所示
然后点击确定、应用。随后编译该代码,会出现一个add.lib文件,如下所示
回到大项目,在头文件处添加add.h,如下所示
在大项目主文件中引用add.h,同时,由于add.c编译成了静态库,所以需要在大项目主文件中加上一条声明语句:
#pragma comment(lib,"add.lib");
写在最后:想薅我羊毛?没门!
四.函数注意事项
1.为什么要做到高内聚低耦合?
根据百度
每个模块间相互联系的紧密程度,模块之间联系越紧密,则耦合性越高,模块的独立性就越差!反之同理。
一个项目中有20个模块方法调用良好,但是要修改了其中一个,另外的19个都要进行修改,这就是高耦合!独立性太差!
架构设计时的内聚高低是指,设计某个模块时,模块内部的一系列相关功能的相关程度的高低。相关程度越高,我们称之为高内聚,反之低内聚;内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
很明显,程序的内聚性越高,代表功能的相关性也就越高。
因此高内聚低耦合是为了后续修改的便捷与更低的时间复杂度。
2.main函数可以放在任意位置
3.局部变量(临时调用的变量)储存在栈区
4.函数中的复合语句中定义的变量只在复合语句中有效
5.sizeof函数不能用在自定义函数里求元素个数,如果是字符串可以用strlen函数
五.函数递归链接