在 C 语言的学习旅程中,变量与常量是基础且关键的知识点。理解它们的概念、定义方式、命名规则以及作用域,对于后续深入学习 C 语言编程至关重要。本文将围绕这些方面展开详细介绍。
一、变量与常量的定义
在编程世界里,变量和常量是两个基础概念。简单来说,内容会改变的量就是变量,而内容不可变的量则是常量。用生活中的例子来理解,变量就如同汽车行驶的速度,会因路况、驾驶习惯等因素而变化;常量则像一年的月份数量,始终固定为 12 个 ,不会轻易改变。
二、变量的命名规则
变量的命名不是随意为之,需要遵循一定规则:
见名知意:这是非常重要的一点。一个好的变量名应该能够清晰地表达该变量的用途,这样在阅读和维护代码时,其他人(包括未来的自己)能迅速理解代码含义。比如,用studentAge表示学生的年龄,用userName表示用户名,看到变量名就能知道它所代表的数据内容。字符组成限制:变量名只能由字母、数字和下划线组成,并且不能以数字开头。像123abc这样以数字开头的名称是不合法的变量名,而abc123、_abc、abc_123等则是符合规则的。避免使用关键字:C 语言中有一些具有特殊含义的关键字,如int、return、if等,这些关键字不能用作变量名,否则会导致编译错误。
此外,常见的命名风格有驼峰命名法(如studentAge)和下划线命名法(如student_age) 。不同的命名风格在不同的编程环境和团队中可能有不同的偏好,但只要保持一致性,都能有效提高代码的可读性。
三、定义变量的方法
在 C 语言中定义变量时,有一些要点需要注意:
赋初始值:一定要给变量赋初始值,否则使用未初始化的变量可能会导致不可预期的结果。例如,当你定义一个int类型的变量num却未初始化,直接使用printf("%d", num);输出时,可能会得到一个随机的数值,因为未初始化的变量在内存中的值是不确定的。避免重名:在相同的作用域内,变量名不能重复定义,否则会造成混淆,导致编译错误。
下面是一个定义变量的示例代码:
#include
#define _CRT_SECURE_NO_WARNINGS
int main() {
// 变量定义的注意部分:
// 1. 一定要赋初始值,防止使用未初始化的变量导致不可预期的结果
// 2. 不能重名,避免造成混淆和编译错误
// 身高、体重为浮点型数据
double height = 1.8;
double weight = 135;
printf("身高: %.2f\n", height);
printf("体重: %.2f\n", weight);
return 0;
}
在这段代码中,定义了height和weight两个double类型的变量,并分别赋予初始值,然后使用printf函数输出变量的值。
四、变量的分类与作用域
变量主要分为局部变量和全局变量,它们的作用域有明显区别。
局部变量:局部变量就像是在某个房间里使用的工具,只能在这个房间({ })内发挥作用。一旦离开了这个{ },变量就会从内存中销毁。例如:#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
{
int a = 10;
printf("局部作用域内 a 的值: %d\n", a);
}
// a 在局部范围外,下面这行代码会导致编译错误
// printf("局部作用域外 a 的值: %d\n", a);
return 0;
}
在上述代码中,a是在{ }内定义的局部变量,在{ }外尝试访问它会引发编译错误。
2. 全局变量:全局变量类似于公共区域的设施,整个房子(整个工程)里的人都能使用。它的作用域涵盖了同一个文件内的不同函数,甚至不同文件内的函数(前提是通过extern关键字声明)。例如:
#define _CRT_SECURE_NO_WARNINGS
#include
// 全局变量
int a = 10;
void test() {
// test方法内部可以使用
printf("test函数中 a 的值: %d\n", a);
}
int main() {
test();
// main方法内部可以使用
printf("main函数中 a 的值: %d\n", a);
return 0;
}
在这个例子中,a是全局变量,在test函数和main函数中都能正常访问和使用。
如果在不同文件中使用全局变量,可以通过extern关键字来声明。假设在database.c文件中定义了全局变量a:
// database.c文件内容
#define _CRT_SECURE_NO_WARNINGS
// 定义全局变量
int a = 20;
在另一个 C 文件中,就可以这样使用:
#define _CRT_SECURE_NO_WARNINGS
#include
// extern 关键字表明 a 是一个在其他地方定义的全局变量
extern int a;
void test() {
printf("test函数中 a 的值: %d\n", a);
}
int main() {
test();
printf("main函数中 a 的值: %d\n", a);
return 0;
}
需要注意的是,当全局变量和局部变量名称相同时,在局部变量的作用域内,以局部变量赋的值为准。
五、常量的定义
在 C 语言中,常量有多种类型,常见的包括字面常量、const修饰的常量、#define宏定义的标识符常量以及枚举常量。
字面常量:就是直接写在代码中的常量值。例如:int age = 10;
char name[12] = "张三";
char gender = 'M';
这里的10、"张三"、'M'都是字面常量。
2. const 修饰的常量:使用const关键字修饰的常量,一旦赋值后就不能再更改。通常为了提高代码可读性,const常量的命名习惯采用全大写。例如:
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
// 常量是一种特殊的变量,赋了值后不能更改!
// const 的命名规则:全大写,提高代码可读性
const double PI = 3.14; // 圆周率
const double E = 2.71828; // 自然对数
printf("圆周率: %.2f\n", PI);
printf("自然对数: %.5f\n", E);
// 尝试修改 const 常量会导致编译错误
// PI = 3.15;
return 0;
}
如果尝试取消注释PI = 3.15;这行代码,编译时会报错,因为const修饰的常量不允许被修改。
3. #define 宏定义的标识符常量:#define是 C 语言中的预处理指令,用于定义标识符常量。它的工作原理是在编译之前进行简单的文本替换。例如:
#include
// 全局常量
// 标识符常量
// 易错点说明:
// 1. 不能添加 ;,因为 #define 是简单的文本替换,添加分号会导致替换后的代码出现语法错误
// 2. 不能写成 PI = 3.14,#define 不是赋值语句
#define PI 3.14
#define AGE 18
#define COUNTRY "中国"
int main() {
printf("圆周率: %.2f\n", PI);
printf("年龄: %d\n", AGE);
printf("国家: %s\n", COUNTRY);
return 0;
}
在使用#define定义常量时,要注意不能添加分号,也不能写成类似赋值的形式,如PI = 3.14,这不符合其语法规则。
4. 枚举常量:使用enum关键字定义枚举常量,它用于将有穷集合的所有数据一一罗列出来。枚举常量默认从 0 开始依次递增,也可以手动赋值。例如:
#define _CRT_SECURE_NO_WARNINGS
#include
// 定义性别枚举类型
enum Gender {
MALE, // 男,默认值为0
FEMALE, // 女,默认值为1
SECRECY // 保密,默认值为2
};
int main() {
// 枚举:将有穷集合所有数据,一一罗列出来
// 有穷集合:数据有限
int age = 10;
// 定义枚举类型的变量
enum Gender gender = FEMALE;
if (gender == MALE) {
printf("性别是:男性\n");
} else if (gender == FEMALE) {
printf("性别是:女性\n");
} else {
printf("性别是:保密\n");
}
return 0;
}
在这个例子中,定义了Gender枚举类型,包含MALE、FEMALE、SECRECY三个枚举常量,并定义了gender变量,根据其值进行不同的输出。如果想要手动赋值,可以这样写:
enum Color {
RED = 1,
GREEN = 2,
BLUE = 3
};
这样RED的值就是 1,GREEN的值是 2,BLUE的值是 3 。
通过对变量和常量的深入学习,我们为进一步掌握 C 语言编程打下了坚实的基础。在后续的学习中,我们将继续探索 C 语言的其他重要特性。
希望这篇学习记录能对正在学习 C 语言的小伙伴们有所帮助,如有错误或不足之处,欢迎大家在评论区指正交流!