C 语言基础-常量和变量
常量(只读)
常量是只读的固定值,在程序运行期间不会改变,不能被程序修改的量,可以是任意类型。
定义常量的方式有两种:
- 使用 #define 宏定义
- 使用 const 关键字
常量大体分为:
- 直接常量(字面常量)
- 符号常量(#define 定义的标识符常量)
- 常变量(const修饰的变量)
- 枚举常量
注意:严格意义说const修饰的变量称为常变量更合适,而不能被称为符号常量,因为const修饰的变量,其值不一定是不可修改的,如:int * const p2 = 10;
,p2是常量指针,但*p2却是整形变量。
直接常量(字面常量)
能直接得知它的值和类型,称其为直接常量(字面常量)。
符号常量
定义一个标识符(名称)来表示一个常量,该标识符称之为符号常量。
使用 #define 定义符号常量
#define又称宏定义,用标识符定义为其后的常量,该标识符称为符号常量。
- 在预编译阶段起作用
- 单纯进行文本替换,没有类型,不做类型检查,也不能进行调试
- 只是代码的展开操作,不分配内存,占的是test段(代码段)空间
- 宏调用时,需要程序设计者自行确保宏调用参数的类型正确。
- 过多的使用宏定义,会增加代码长度,会使二进制文件变大,会增加编译时间
- 宏定义允许嵌套宏定义
定义语法:#define 标识符 常量 //注意, 最后没有分号
定义字面常量:
#define A 10
#define B 'b'
#define C "123"
#define PI 3.14
// 允许嵌套,这里嵌套这已定义的PI
#define S PI*A
常变量(const修饰的变量)
通过const关键字修饰的变量,被称为常变量。
- 定义语法:const type variable = value;
- const 定义常量与赋值要在一个语句内完成,才是合格的常变量哟。
- 定义常量时建议使用大写字母定义,便于与变量名区分。
const定义常量正确示例:
const int var = 15;
const定义常量错误示例:
// 不合格 因为var已经是常变量啦,先声明再赋值根本行不通呀
const int var;
// 编译器报错:Cannot assign to variable 'var' with const-qualified type 'const int'
var = 15;
实例参考:
int *p; /* 定义的是指针变量 */
/**
const 修饰的是整个右边的部分
p1是指针变量,*p1是整型常量
*/
int const *p1 = 10;
/**
p2是常量指针,*p2是整型变量
*/
int * const p2 = 10;
/**
p3与*p3都是只读常量
*/
int const * const p3 = 10;
枚举常量
枚举是由一组不变的值组成,枚举值是常量,都是int(整型),在程序运行时才会分配内存,存放在data段的静态存储区。
定义语法:enum EnumName{标识符,标识符,…}
enum COLOR
{
RED,
BLUE,
GREEN
};
该语句执行后有两个变化:
- COLOR成为枚举的名称,成为一种新类型.
- 如果没有特殊说明,默认枚举中标示符的值是从0开始递增,每次+1,即RED=0,BLUE=1,GREEN=2,…
也可以自己定义枚举值:
enum COLOR
{
RED = 100,
BLUE = 200,
GREEN = 300
};
枚举的优点:
- 枚举使代码更清晰,增加可读性,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示。
- 限制开发者不能随意赋值,只能在列举的值中选择。
- 枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。
变量(可读可写)
变量是可读可写的,可以认为是程序可操作的存储区的名称,表示在程序执行期间可以改变值,可以是任意类型。
- 使用前必须先进行定义。
- 变量声明时,会分配一块存储空间给变量,以便以后存储数据。
- 如果定义了多个变量则为多个变量分别分配不同的存储空间。
- 类型决定了变量存储的大小和布局,不同类型的变量占用不同大小的存储空间。
- 变量的名称可以由字母、数字和下划线字符组成,建议使用驼峰命名法。
变量分为:
- 全局变量:在函数、方法、代码块外部定义的变量被称为全局变量。
- 静态变量:static 关键字修饰的变量被称为静态变量
- 局部变量:在函数、方法、代码块内部部定义的变量被称为局部变量。
变量声明
表明变量的类型和名称,会为变量分配内存空间。
- 向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
- 变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
- 声明格式:类型 标识符(变量名)
int w;// 声明一个整型变量
声明多个变量格式:类型 标识符,标识符;
int a,b,c;
变量的声明有两种情况:
- 分配存储空间的,如:int a;声明的时候就会分配存储空间。
- 不会分配存储空间的,使用extern关键字声明变量名而不定义它。 例如:extern int a; 其中变量 a 可以在别的文件中定义的。
extern int i; //声明,不是定义
int i; //声明,也是定义
声明变量格式:类型 标识符;
int num;
变量初始化
先声明,后赋值:
int a;
a = 10;
声明同时直接赋值:
int a = 10;
注意: 变量没有初始化时不要轻易拿来使用(下面的写法是不建议的)
int score;//未初始化的变量,它的内容的不确定的,随机的。
printf(“score =%d”,score);
定义变量
定义 = 声明 + 初始化
定义变量格式:类型 标识符 = value;
int d = 9;
C 中的左值(Lvalues)和右值(Rvalues)
C 中有两种类型的表达式:
- 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
- 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;
参考文献:
C 变量