一、变量
1、变量定义
变量的名称可以由字母、数字和下划线字符组成,它必须以字母或下划线开头,C语言区分大小写;C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等。
变量就是程序可操作的存储区的名称,变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,例如:
type variable;
type variable1, variable2...;
type variable = value; // 变量可以在声明的时候被初始化(指定一个初始值)
type 必须是一个有效的 C 数据类型,可以是 char、w_char、int、float、double 或任何用户自定义的对象,variable可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。
2、变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
(1)一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
(2)另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
extern int i; //声明,不是定义
int i; //声明,也是定义
除非有extern关键字,否则都是变量的定义。
如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可。
#include <stdio.h>
/*外部变量声明*/
extern int a;
extern int b;
int add()
{
return a + b;
}
(一)全局变量
全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问,也就是说,全局变量在声明后整个程序中都是可用的。
注意:
- 在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用,也就是说,函数内部的定义的局部变量优先级高于全局变量。
- 全局变量不属于某个函数,它的有效范围定定义该全局变量的位置开始直至源文件结束。
- 全局变量允许多个函数对某个变量进行修改,但破坏了函数的独立性。
- 全局变量在程序执行过程中始终占用存储单元,而局部变量只有在使用的时候才会分配存储空间。
例如:
#include <stdio.h>
/*全局变量声明*/
int a;
int b;
int add()
{
return a + b;
}
(二)局部变量
在某个函数或块的内部声明的变量称为局部变量,它们只能被该函数或该代码块内部的语句使用,局部变量在函数外部是不可知的。
注意:
- 形参属于被调函数的局部变量,实参则属于主调函数的局部变量。
- 不同的函数中,可以使用相同的局部变量名。
- 主函数中的变量只能在主函数中使用,不能在其他函数中使用。
- 复合语句中定义变量,其作用域只能在复合语句范围内。
- 局部变量只有在使用的时候才会分配存储空间,使用结束后回收。
例如:
int main ()
{
/* 局部变量声明 */
int a, b;
int c;
/* 实际初始化 */
a = 10;
b = 20;
c = a + b;
printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
return 0;
}
(三)静态变量
静态变量的修饰关键字是static,static可以作用于变量以及函数。由static修饰的,可分为静态局部变量,静态全局变量,静态函数。静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收存储空间。 静态变量属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量
。 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
(1)静态全局变量
在全局变量的定义前加上static就构成了静态全局变量,静态全局变量只初使化一次,防止在其他文件单元中被引用。静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
例如:
#include <stdio.h>
/*静态全局变量声明*/
static int a;
static int b;
int add()
{
return a + b;
}
(2)静态局部变量
在局部变量的定义前加上static就构成了静态局部变量,静态局部变量只会被初始化一次,下次使用依据上一次保存的值。静态局部变量在函数内定义 ,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。
静态局部变量是一种生存期为整个源程序的变量,虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了上次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。
例如:
#include <stdio.h>
int add(int x,int y){
return x + y;
}
int main(){
static int a = 10;
static int b = 5;
int result;
result = add(a,b);
printf("sum: %d",result);
return 0;
}
二、常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改
。
在 C 语言中,有两种简单的定义常量的方式:
1、使用 #define 预处理器
#define identifier value
例如:
#include <stdio.h>
// 此时,a和b为常量,其值不可被修改
#define a 10
#define b 20
int add()
{
return a + b;
}
2、使用 const 关键字
const 声明常量要在一个语句内完成,尽量把常量定义为大写字母形式
const type VAR= value;
const int VAR= 5; // 正确定义
const int VAR; // 错误定义
// 错误定义
const int VAR;
VAR= 5;