1.作用域规则
(1). 名字的作用域指程序中可使用该名字的部分;
(2). 外部变量或函数的作用域从声明它的地方开始,到其所在的文件的末尾结束。
(3). 声明
使用另一个源文件中定义的变量或函数或使用当前源文件中当前位置后的变量或函数,为了名字可见,需要在当前位置前添加声明。
c
语言外部变量的声明必须添加extern
前缀修饰,否则会被认为是变量定义。
(4). 变量声明与定义
a. 变量声明用于说明变量的属性,变量定义除此之外还将引起存储器的分配.
b. 外部变量初始化只能出现在定义中.
c. 定义只有一个,声明可以有多个.
d. 数组定义时需要指明容量,声明时可以不必.
2.static变量
(1). 使用static
修饰变量或函数定义时,可以使得修饰的变量或函数只在定义的源文件内使用。不可在其他源文件中通过声明来使用。
(2). 局部变量采用static
修饰后,只在首次进入局部作用域时初始化一次。后续每次进入局部作用域时,跳过初始化。
3.寄存器变量
// 建议编译器将变量放在寄存器
// register只可用于自动变量,形参
register int x;
register char c;
在变量定义时,用register
修饰,达到建议编译器将变量放置到寄存器的效果。声明为寄存器类型的变量不可获取变量地址.
4.初始化
默认初始化:
(1). 外部和静态变量将被初始化为0
.
(2). 自动和寄存器变量的初值则未定义.
显式初始化:
(1). 对外部和静态变量,初始化必须是常量表达式,初始化只执行一次。
(2). 对局部和寄存器变量,其初始化表达式不要求是常量表达式。
(3). 数组列表初始化时可自动推导数组容量,初始化值个数可比容量少,不可多。少时,剩余元素初始化为0
。
(4). 字符数组可用字符串来初始化。
5.#,##
(1). #
使用示例
#define dprint(expr) printf(#expr " = %g\n", expr)
dprint(x/y) // printf("x/y" " = %g\n", x/y)->printf("x/y = %g\n", x/y)
#
起到名字变为字符串作用
(2). ##
使用示例
#define paste(front, back) front ## back
paste(name, 1)// name ## 1->name1
##
起到黏合作用;##
左边,右边的空格粘合后消失.