一、核心概念
变量:程序运行时可以改变的数据容器,存储在内存中,有明确的数据类型和名称。
常量:程序运行时不可修改的固定值,分为字面常量、符号常量(const)、预处理器常量(#define)。
二、关键知识点
- 变量特性:
- 声明语法:数据类型 变量名;(如 int age;)
- 必须初始化后才能安全使用(否则是垃圾值)
- 作用域:局部变量(函数内) vs 全局变量(文件内)
- 生命周期:自动变量(函数结束销毁) vs 静态变量(程序结束销毁)
- 常量分类:
- 字面常量:直接写出的值(如 100, “Hello”)
- const常量:带类型检查的只读变量(如 const float PI = 3.14;)
- 宏常量:预处理阶段的文本替换(如 #define PI 3.14)
- 对比差异:
特性 | 变量 | const常量 | 宏常量 |
内存分配 | 占用内存 | 占用内存 | 不占用内存 |
类型检查 | 有 | 有 | 无 |
调试可见性 | 可以观察地址和值 | 可以观察地址和值 | 无法调试 |
作用域 | 遵循变量作用域规则 | 遵循变量作用域规则 | 文件全局替换 |
三、快速理解技巧
- 变量比喻:带标签的收纳盒(盒子上贴名字,内容可更换)
- 常量比喻:刻字的石碑(内容刻好后无法修改)
- 记忆口诀:
变量就像小盒子,名字类型装数据
常量刻字不变化,三种形式要分清
声明变量分类型,const宏定义选场景
先声明,后使用,初始化要牢记心
四、代码实例与逐行解析
#include <stdio.h>
#define TAX_RATE 0.1 // 宏常量:预处理时替换文本
int main() {
// 变量声明与初始化
float price = 100.0; // 创建可修改的价格变量
const float PI = 3.14; // const常量:圆周率
// 计算带税价格
float total = price * (1 + TAX_RATE); // 使用宏常量计算
// 打印结果(包含字符串常量)
printf("商品价格: %.1f\n含税总价: %.1f\n", price, total);
printf("圆周率常量值: %f\n", PI);
return 0; // 整型字面常量作为返回值
}
逐行解释:
- #include 包含标准输入输出库,使printf可用
- #define TAX_RATE 0.1宏常量定义:编译器在预处理阶段将所有TAX_RATE替换为0.1
- int main()程序入口函数,返回整型值
- float price = 100.0;
- float:声明单精度浮点类型
- price:变量名称
- = 100.0:初始化赋值(100.0为浮点字面常量)
- const float PI = 3.14;
- const:使变量成为只读常量
- 试图修改PI会导致编译错误
- float total = price * (1 + TAX_RATE);
- TAX_RATE被替换为0.1
- 1为整数字面常量,自动转换为浮点参与运算
- printf(“商品价格…”, price, total);
- 字符串常量作为格式说明
- %.1f:格式化输出浮点数,保留1位小数
- return 0;
- 0为整数字面常量
- 表示程序正常退出
五、易错点提醒
- 变量未初始化:int a; printf(“%d”,a); 可能输出随机值
- 修改const常量:const int x=5; x=10; 导致编译错误
- 宏常量陷阱:#define SQUARE(x) x*x调用SQUARE(3+2)会展开为3+2 * 3+2=11
六、应用场景选择
- 需要类型检查时 → 用const常量
- 需要跨文件使用的常量 → 用extern const
- 简单数值替换 → 用宏常量
- 需要调试观察值 → 避免使用宏常量