C 语言学习笔记:变量与常量
在 C 语言的学习旅程中,变量与常量是基础且关键的知识点。理解它们的概念、定义方式、命名规则以及作用域,对于后续深入学习 C 语言编程至关重要。本文将围绕这些方面展开详细介绍。
一、变量与常量的定义
在编程世界里,变量和常量是两个基础概念。简单来说,内容会改变的量就是变量,而内容不可变的量则是常量。用生活中的例子来理解,变量就如同汽车行驶的速度,会因路况、驾驶习惯等因素而变化;常量则像一年的月份数量,始终固定为 12 个 ,不会轻易改变。
二、变量的命名规则
变量的命名不是随意为之,需要遵循一定规则:
- 见名知意:这是非常重要的一点。一个好的变量名应该能够清晰地表达该变量的用途,这样在阅读和维护代码时,其他人(包括未来的自己)能迅速理解代码含义。比如,用
studentAge
表示学生的年龄,用userName
表示用户名,看到变量名就能知道它所代表的数据内容。 - 字符组成限制:变量名只能由字母、数字和下划线组成,并且不能以数字开头。像
123abc
这样以数字开头的名称是不合法的变量名,而abc123
、_abc
、abc_123
等则是符合规则的。 - 避免使用关键字:C 语言中有一些具有特殊含义的关键字,如
int
、return
、if
等,这些关键字不能用作变量名,否则会导致编译错误。
此外,常见的命名风格有驼峰命名法(如studentAge
)和下划线命名法(如student_age
) 。不同的命名风格在不同的编程环境和团队中可能有不同的偏好,但只要保持一致性,都能有效提高代码的可读性。
三、定义变量的方法
在 C 语言中定义变量时,有一些要点需要注意:
- 赋初始值:一定要给变量赋初始值,否则使用未初始化的变量可能会导致不可预期的结果。例如,当你定义一个
int
类型的变量num
却未初始化,直接使用printf("%d", num);
输出时,可能会得到一个随机的数值,因为未初始化的变量在内存中的值是不确定的。 - 避免重名:在相同的作用域内,变量名不能重复定义,否则会造成混淆,导致编译错误。
下面是一个定义变量的示例代码:
#include <stdio.h> #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 <stdio.h> 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 <stdio.h> // 全局变量 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 <stdio.h> // 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 <stdio.h> 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 <stdio.h> // 全局常量 // 标识符常量 // 易错点说明: // 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 <stdio.h> // 定义性别枚举类型 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 语言的小伙伴们有所帮助,如有错误或不足之处,欢迎大家在评论区指正交流!
C语言的初步学习