在程序中,数据需要被存储和操作。C语言提供了变量和常量两种机制来管理数据。 变量是可以在程序运行过程中改变值的存储单元,而常量则是固定不变的值。 理解它们的区别与用法是编写灵活、可靠程序的关键。
变量本质上是一块内存区域的名称,用于存储特定类型的数据。通过变量名,我们可以访问或修改这块内存中的值。
在C语言中,变量需要先声明(指定类型和名称)后才能使用。声明同时也可以定义(分配内存)。
语法:数据类型 变量名; 或 数据类型 变量名 = 初始值;
int age; // 声明并定义一个整型变量 age(未初始化)
float price = 99.9; // 定义并初始化为 99.9
char grade = 'A'; // 定义字符变量并初始化
_。score 和 Score 是不同的变量)。student_age 而不是 a)。作用域决定了变量在程序的哪些部分可以被访问。C语言主要有以下几种作用域:
{} 内定义的变量,只在该代码块内有效。extern 扩展到其他文件。#include <stdio.h>
int globalVar = 100; // 全局变量,文件作用域
void func() {
int localVar = 10; // 局部变量,函数作用域
printf("局部变量: %d\n", localVar);
printf("全局变量: %d\n", globalVar);
}
int main() {
if (1) {
int blockVar = 20; // 块作用域,仅在if语句块内有效
printf("块变量: %d\n", blockVar);
}
// printf("%d", blockVar); // 错误!blockVar在此处不可见
func();
return 0;
}
C语言提供了四种存储类别说明符,用于控制变量的生命周期和作用域:
| 存储类别 | 关键字 | 作用域 | 生命周期 | 初始值 |
|---|---|---|---|---|
| 自动变量 | auto(默认) | 块作用域 | 函数调用时创建,结束时销毁 | 未初始化时为垃圾值 |
| 寄存器变量 | register | 块作用域 | 与自动变量类似,建议存入CPU寄存器 | 未初始化时为垃圾值 |
| 静态局部变量 | static | 块作用域 | 程序整个运行期间 | 默认初始化为0 |
| 外部变量 | extern | 文件作用域(可跨文件) | 程序整个运行期间 | 默认初始化为0 |
#include <stdio.h>
void counter() {
static int count = 0; // 静态局部变量,只初始化一次
count++;
printf("调用次数: %d\n", count);
}
int main() {
counter(); // 输出1
counter(); // 输出2
counter(); // 输出3
return 0;
}
常量是在程序执行期间值不会改变的量。C语言中有多种定义常量的方式:
直接写在代码中的固定值,如 10、3.14、'A'、"Hello"。
int a = 100; // 100 是整型字面常量
float pi = 3.14159; // 3.14159 是浮点型字面常量
char ch = 'M'; // 'M' 是字符型字面常量
#define 定义符号常量(宏常量)预处理指令,在编译前进行文本替换,没有类型检查。
#define PI 3.14159
#define MAX_STUDENTS 100
int main() {
double area = PI * 10 * 10;
int students[MAX_STUDENTS];
return 0;
}
const 关键字定义常量const 修饰的变量具有类型,编译时会进行类型检查,更安全。
const double PI = 3.14159;
const int MAX = 100;
int main() {
// PI = 3.14; // 错误!不能修改 const 变量的值
printf("PI = %f\n", PI);
return 0;
}
#define 是预处理阶段替换,不占内存,无类型;const 是运行时变量,有类型,可调试。#define 或 const 均可,但 const 更符合现代编程风格。使用 enum 定义一组相关的整数常量,增强代码可读性。
enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };
enum Color { RED = 1, GREEN = 2, BLUE = 4 };
int main() {
enum Weekday today = MON;
printf("today = %d\n", today); // 输出 0
return 0;
}
#include <stdio.h>
#define TAX_RATE 0.06 // 宏常量
const double DISCOUNT = 0.8; // const常量
int main() {
// 变量定义
double price = 99.9;
int quantity = 3;
static int totalSold = 0; // 静态变量,记录总销量
double subtotal = price * quantity;
double tax = subtotal * TAX_RATE;
double finalPrice = subtotal + tax;
// 应用折扣(如果满足条件)
if (quantity >= 5) {
finalPrice *= DISCOUNT;
}
totalSold += quantity;
printf("商品单价: %.2f\n", price);
printf("购买数量: %d\n", quantity);
printf("小计: %.2f\n", subtotal);
printf("税费: %.2f\n", tax);
printf("最终金额: %.2f\n", finalPrice);
printf("累计销量: %d\n", totalSold);
return 0;
}
#define SQUARE(x) x*x 在 SQUARE(2+3) 时会变成 2+3*2+3,正确写法应加括号 #define SQUARE(x) ((x)*(x))。extern 声明,否则会出现链接错误。变量与常量是C语言程序的基础,掌握它们的声明、作用域和存储类别能帮助你写出更高效、更健壮的代码。 下一章我们将学习运算符与表达式,开始构建更复杂的逻辑。