【前言】
上篇博客我们认识了函数的定义和调用,本篇博客继续带大家总结函数的有关知识,有关函数的三种语句,有关变量的三种属性,还有最后分解C语言代码的口诀总结,看官不容错过~【有关函数的三种语句】
定义、使用/调用、原型声明语句1.函数的定义
函数返回值类型 函数名(形式参数列表)
{
函数体;
}
上篇博客已经介绍过的定义方式,函数返回值类型分两种,void型和非void型(必须有return)。
2.调用
非void型
变量名=函数名 (实参列表);
void型
函数名 (实参列表);
上篇也介绍过了,不再赘述。
3.原型声明语句: 有类型,有分号
主要有两种形式:
函数类型 函数名(形参类型1 形参变量1,形参类型2 形参变量2…);
函数类型 函数名(形参类型1 ,形参类型2 …);
还记不记得什么时候该原型声明大显身手呢?
先在主函数中使用了子函数,子函数定义在主函数下方。所以,必须在主函数前进行函数原型声明。如果先定义后使用,就不用使用原型声明啦。
以上的三种语句容易混淆,大家了解各自的特点后,就容易区分开了。
=======================================================================
【有关变量的三属性】
数据类型、 作用范围 、存储类别 跨越了“种族,空间和时间”1.数据类型
有类型有分号定义语句。没有类型有分号就为执行语句。
2.作用范围 :空间角度
内部变量,局部有效 。只在所在函数内有效,不同函数的相同变量名互不干扰,所有形式的参数都是局部变量。
花括号是复合语句的标识,在复合语句中定义内部变量,就在复合语句内有效。
外部变量, 全局有效。有效范围为整个文件,因为可以被每个函数调用,所以全局变量很容易被改掉值。如果全局变量和局部变量不凑巧的撞衫同名,局部变量就会屏蔽全局变量,只使用局部,像不像“金窝银窝都不如自己的dog窝”的感觉。
3.存储类别 :时间角度
变量存储类别只能是auto static register extern 四种之一,我也是到里这章才很直接清晰的认识到小变量也有大内涵。变量是有存储类别的,我们之前定义局部变量int a 啊什么的,看似只定义了数据类型为int,其实还有隐含其中的auto存储类型,因为如果没有明确写存储类型的时候,我们就默认是auto自动类型的。感觉函数这一章还是挺长知识的。
1.auto类别变量
auto特点:调用完后就释放所占用空间,局部变量默认为auto类别,无初始化时就是随机值。使用时间短(临时),一般都为auto类别变量。
auto int x; 定义同时说明类型,这里的auto可省略。
2.static类别变量
static的特点:从定义到程序运行结束(时间长)均占用存储空间。全局变量默认为static,无初始化初值为0。static类别变量只进行一次初始化,从次以后,static修饰的变量就一直是一个带值前行的变量了,值修改后,可以保留传承下去。
static int x; /*定义同时说明类型
TIPS小技巧:代码中,遇到静态变量,就冷静的把它画到框里,作为静态变量的保护框,然后把代码划掉,因为只初始化一次,下次就不再走初始化的语句了。
3.register类别变量
还记不记得CPU里的寄存器?变量存储类型里居然有一个寄存器类型。register类别只能是局部变量(使用时间短,寄存器)才能被说明,当遇到大量反复调用相同语句的时候就可以考虑用register类型了。
register int x; 定义同时说明类型
4.extern类别变量
extern的特点是加大变量的作用范围(外部)。同一文件和不同文件之间都可以用extern来拓宽作用范围。
格式1
存储类别 类型名 变量名;
格式2
类型名 变量名;
存储类别 变量名;
举个栗子:
#include<stdio.h>
main(){
extern x,y;
printf("%d,%d\n",x,y);
}
int x,y;
xy两个变量在main函数内没有定义,但是在main函数下面定义了,在main里想要使用xy,就要使用extern,表明我这两个xy不是师出无门,而是已在别处定义了的有门有派的变量,extern就是这样拓宽了变量的作用范围。还是蛮神奇的一个类型。
了解了extern,从现在起,你判断一个变量从什么时候开始有效,都有什么想法呢?现在可以从两点开始看了,一是从定义那句,二就是出现extern的时候,该让你的对变量作用范围的雷达敏感起来了。
【口诀总结】
最后还是要冒泡总结一下分解C语言代码时的一些口诀。一、求表达式的值
1.先看合法性
2.合法表达式,短路优先考虑,&&与和或||
3.合法无短路,三步走,挑运算符,计算优先级别高的,同级考虑结合性
=======================================================================
二、分析结构
找配对,3配对 (花括号,else,do)
找控制 ,6控制(if else switch where do for 就近控制算一条,复合语句算一条)
标语句
=======================================================================
三、函数调用过程
复合框架如何执行?分析小括号含义
从主函数进入,顺序执行,遇到函数调用就出门,单向传值遵循三一致(参数个数、类型、位置次序)。子函数遇到return或右花括号则返回主函数调用处,继续向下执行。
因为预编译的知识也不少,所以就打算单独拿一篇来介绍了,下次见~