c语言在设计中考虑函数的高
效性与易用性。
一个程序可以保存在一个或多个源文件中,各个文件可以单独编译,并可以和库中已编译过的函数一起加载。
ANSI标准对C语言所做的最明显的修改是 函数声明与函数定义两方面 。
4.1 函数的基本知识
如果函数定义中省略了返回值类型,则默认认为是int类型。
4.2 返回非整型值的函数4.3 外部变量
由于C语言不允许在一个函数内部定义其他函数,因此函数本身是“外部的”。
外部变量与函数具有下列性质:通过同一个名字对外部变量的所有引用,实际上都是引用同一个对象。
外部变量的 用途还表现在他们与内部变量相比具有更大的作用域和更长的生存期。4.4 作用域规则
一个外部变量只能在某一个文件中定义一次,而其他文件可以通过extern声明来访问它。
外部变量的定义中必须指定数组的长度,但extern声明则不一定要制定数组的长度。
4.5 头文件
4.6 静态变量
通过static限定外部对象,可以达到隐藏外部对象的目的。
static限定的内部变量与自动变量不同,不管其所在的函数是否被调用,它一直存在,而不像自动变量那样,
随着所在函数的被调用和退出而存在和消失。
4.7 寄存器变量
register声明告诉编译器,所声明的变量在程序中使用频率较高。其思想是,将register变量放在机器的寄存器
中,可以使程序更小,执行速度更快。
register只适用于自动变量以及函数的形式参数。实际使用时,底层硬件环境的实际情况对寄存器变量的使用会有一些限制。
无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。
4.8 程序块结构
在函数中可以以程序块的形式定义变量。
这种方式声明的变量可以隐藏程序块外与之同名的变量,它们之间没有任何关系,并在右花括号出现之前一直存在。
如:
if (n > 0) {
int i; /* 声明一个新的变量i */
for (i = 0; i < n; i++)
...
}
变量i的作用域就是if语句的“真”分支,与程序块外的i无关。
程序块内的自动变量(包括形式参数)也可以隐藏同名的外部变量和函数。
int x;
int y;
f(double x)
{
double y;
}
在一个好的程序风格中,应该避免出现变量名隐藏外部作用域中相同名字的情况。
4.9 初始化
在不进行显示初始化的情况下,外部变量和静态变量都将被初始化为0,而自动变量和
寄存器变量的初值则没有定义。外部和静态变量只初始化一次,自动和寄存器变量每次
进入函数或程序块时都被初始化。
4.10 递归
4.11 C预处理器
两个最常用的的预处理器指令是:#include 在编译期间把指定文件的内容包含进当前文件中。
#define指令,用任意字符序列替代一个标记。
4.11.1 文件包含
如果用引号引起来,则在源文件所在位置查找该文件,如果没有找到,或者如果文件用尖括号括起来
则根据相应的规则查找文件。
4.11.2 宏替换
如果对各种类型的参数的处理都是一致的,则可以将同一个宏定义应用于任何数据类型。
参数名以#作为前缀则结果将扩展为实际参数替换该参数的带引号的字符串。
#define dprint(expr) printf(#expr " = %g\n", expr)
4.11.3 条件包含
#if语句对其中的常量整型表达式(不能包含sizeof,类型转换运算符或enum常量)进行求值。
一个程序可以保存在一个或多个源文件中,各个文件可以单独编译,并可以和库中已编译过的函数一起加载。
ANSI标准对C语言所做的最明显的修改是 函数声明与函数定义两方面 。
4.1 函数的基本知识
如果函数定义中省略了返回值类型,则默认认为是int类型。
4.2 返回非整型值的函数4.3 外部变量
由于C语言不允许在一个函数内部定义其他函数,因此函数本身是“外部的”。
外部变量与函数具有下列性质:通过同一个名字对外部变量的所有引用,实际上都是引用同一个对象。
外部变量的 用途还表现在他们与内部变量相比具有更大的作用域和更长的生存期。4.4 作用域规则
一个外部变量只能在某一个文件中定义一次,而其他文件可以通过extern声明来访问它。
外部变量的定义中必须指定数组的长度,但extern声明则不一定要制定数组的长度。
4.5 头文件
4.6 静态变量
通过static限定外部对象,可以达到隐藏外部对象的目的。
static限定的内部变量与自动变量不同,不管其所在的函数是否被调用,它一直存在,而不像自动变量那样,
随着所在函数的被调用和退出而存在和消失。
4.7 寄存器变量
register声明告诉编译器,所声明的变量在程序中使用频率较高。其思想是,将register变量放在机器的寄存器
中,可以使程序更小,执行速度更快。
register只适用于自动变量以及函数的形式参数。实际使用时,底层硬件环境的实际情况对寄存器变量的使用会有一些限制。
无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。
4.8 程序块结构
在函数中可以以程序块的形式定义变量。
这种方式声明的变量可以隐藏程序块外与之同名的变量,它们之间没有任何关系,并在右花括号出现之前一直存在。
如:
if (n > 0) {
int i; /* 声明一个新的变量i */
for (i = 0; i < n; i++)
...
}
变量i的作用域就是if语句的“真”分支,与程序块外的i无关。
程序块内的自动变量(包括形式参数)也可以隐藏同名的外部变量和函数。
int x;
int y;
f(double x)
{
double y;
}
在一个好的程序风格中,应该避免出现变量名隐藏外部作用域中相同名字的情况。
4.9 初始化
在不进行显示初始化的情况下,外部变量和静态变量都将被初始化为0,而自动变量和
寄存器变量的初值则没有定义。外部和静态变量只初始化一次,自动和寄存器变量每次
进入函数或程序块时都被初始化。
4.10 递归
4.11 C预处理器
两个最常用的的预处理器指令是:#include 在编译期间把指定文件的内容包含进当前文件中。
#define指令,用任意字符序列替代一个标记。
4.11.1 文件包含
如果用引号引起来,则在源文件所在位置查找该文件,如果没有找到,或者如果文件用尖括号括起来
则根据相应的规则查找文件。
4.11.2 宏替换
如果对各种类型的参数的处理都是一致的,则可以将同一个宏定义应用于任何数据类型。
参数名以#作为前缀则结果将扩展为实际参数替换该参数的带引号的字符串。
#define dprint(expr) printf(#expr " = %g\n", expr)
4.11.3 条件包含
#if语句对其中的常量整型表达式(不能包含sizeof,类型转换运算符或enum常量)进行求值。