知识点精讲
一、常量的定义与分类
常量是程序运行过程中值不可修改的量,分为字面常量和符号常量两类,核心用于固定不变的数值/字符。
1. 字面常量(直接常量):直接书写的常量值,无需定义直接使用
// 数值常量(整型、浮点型)
100; // 整型字面常量
3.14; // 浮点型字面常量
// 字符/字符串常量
'a'; // 字符字面常量(单引号)
"hello";// 字符串字面常量(双引号)
2. 符号常量(宏定义常量):用标识符代替常量值,需先定义后使用
// 标准格式:#define 常量名 常量值(无分号!)
#define PI 3.14159
#define MAX_NUM 100
#define MSG "Hello C"
#include
int main() {
printf("圆周率:%f\n", PI); // 使用符号常量
printf("最大值:%d\n", MAX_NUM); // 输出100
printf("提示语:%s\n", MSG); // 输出Hello C
return 0;
}
| 常量类型 |
定义方式 |
示例 |
注意事项 |
| 整型字面常量 |
直接书写 |
10、-5、0 |
不能带小数点 |
| 浮点型字面常量 |
直接书写 |
3.14、-2.5、0.0 |
必须包含小数点或e/E |
| 字符字面常量 |
单引号包裹 |
'a'、'5'、'\n' |
仅能包含1个字符 |
| 符号常量 |
#define 定义 |
#define PI 3.14 |
末尾无分号,大写命名 |
二、变量的核心语法
变量是程序运行过程中值可修改的量,用于存储临时数据,核心规则:先定义、后使用、类型匹配。
1. 变量的定义格式
// 标准格式:数据类型 变量名1, 变量名2, ...;
int age; // 定义整型变量age
float score; // 定义浮点型变量score
char gender; // 定义字符型变量gender
int a, b, c; // 同时定义多个同类型变量
2. 变量的赋值规则
#include
int main() {
// 方式1:定义时赋值(初始化)
int num1 = 10;
// 方式2:先定义后赋值
int num2;
num2 = 20;
// 方式3:多变量赋值
int x = 5, y = 8;
// 错误示例:未定义直接赋值
// num3 = 30; // 编译报错
printf("num1=%d, num2=%d\n", num1, num2); // 输出num1=10, num2=20
return 0;
}
3. 变量的命名规范(标识符规则)
- 由字母、数字、下划线组成,且不能以数字开头
- 区分大小写(如age和Age是两个不同变量)
- 不能使用C语言关键字(如int、float、if等)
- 建议见名知意(如score代表分数,age代表年龄)
// 合法变量名
int stu_age; // 下划线连接
int Score; // 大小写混合
int num123; // 数字结尾
// 非法变量名
int 123num; // 数字开头(错误)
int int; // 使用关键字(错误)
int stu-age; // 包含减号(错误)
三、变量的作用域与存储类别
1. 作用域(变量的有效范围)
#include
// 全局变量:整个程序有效
int global_num = 100;
int main() {
// 局部变量:仅main函数内有效
int local_num = 200;
printf("全局变量:%d\n", global_num); // 输出100
printf("局部变量:%d\n", local_num); // 输出200
{
// 块级局部变量:仅大括号内有效
int block_num = 300;
printf("块级变量:%d\n", block_num); // 输出300
}
// printf("%d\n", block_num); // 报错:block_num未定义
return 0;
}
2. 存储类别(变量的存储方式)
| 存储类别 |
关键字 |
作用域 |
生命周期 |
示例 |
| 自动变量 |
auto(可省略) |
局部 |
函数/块执行期间 |
auto int num = 10; |
| 静态变量 |
static |
局部/全局 |
整个程序运行期 |
static int count = 0; |
| 寄存器变量 |
register |
局部 |
函数/块执行期间 |
register int i; |
| 外部变量 |
extern |
全局 |
整个程序运行期 |
extern int global_num; |
// static静态变量示例(值持久化)
#include
void test() {
static int count = 0; // 仅初始化1次,值持久化
count++;
printf("count = %d\n", count);
}
int main() {
test(); // 输出count = 1
test(); // 输出count = 2
test(); // 输出count = 3
return 0;
}
四、常量与变量常见错误(高频考点)
- 符号常量定义错误:#define PI 3.14;(末尾加了分号)
- 变量未初始化:int num; printf("%d", num);(值为随机数)
- 变量命名错误:int 1num;(数字开头)、int stu-age;(含非法字符)
- 类型不匹配赋值:char ch = 1234;(超出char范围)
- 常量赋值修改:#define MAX 100; MAX = 200;(常量不可修改)
- 局部/全局变量重名:全局int a=10; main(){int a=20;}(局部覆盖全局)
// 错误示例1:符号常量末尾加分号
#include
#define PI 3.14; // 错误:分号导致后续使用报错
int main() {
float area = PI * 5 * 5; // 编译报错
printf("面积:%f\n", area);
return 0;
}
// 错误示例2:变量未初始化
#include
int main() {
int num; // 未初始化,值为随机数
printf("num = %d\n", num); // 输出随机值
return 0;
}
// 错误示例3:常量不可修改
#include
#define MAX 100
int main() {
MAX = 200; // 编译报错:常量不能赋值修改
return 0;
}
例题精选
例题1:符号常量的定义与使用
使用宏定义定义圆周率PI=3.14,计算半径为5的圆的面积(面积公式:πr²)。
#include
#define PI 3.14 // 定义符号常量(无分号)
int main() {
int r = 5;
float area = PI * r * r;
printf("圆的面积:%.2f\n", area);
return 0;
}
运行结果:
圆的面积:78.50
解析:
1. 符号常量定义格式为#define 常量名 常量值,末尾不能加分号,是高频易错点;
2. PI是符号常量,编译时会直接替换为3.14,无类型检查;
3. 面积计算需用浮点型存储(float/double),避免整型截断。
例题2:变量的定义与赋值(类型匹配)
定义整型变量a、浮点型变量b、字符型变量c,分别赋值10、3.14、'A',输出所有变量值。
#include
int main() {
// 定义并初始化变量
int a = 10;
float b = 3.14;
char c = 'A';
// 输出变量值
printf("a = %d\n", a);
printf("b = %.2f\n", b);
printf("c = %c\n", c);
return 0;
}
运行结果:
a = 10
b = 3.14
c = A
解析:
1. 变量需先定义后使用,定义时指定数据类型,赋值需匹配类型;
2. 输出格式符需对应类型:%d(整型)、%f(浮点型)、%c(字符型);
3. 若将char c赋值为"a"(双引号),会编译报错(字符需单引号)。
例题3:变量的作用域(局部/全局)
分析全局变量与局部变量的作用域,输出以下程序的运行结果。
#include
// 全局变量
int num = 100;
void test() {
// 局部变量(覆盖全局)
int num = 200;
printf("test函数内num = %d\n", num);
}
int main() {
test();
printf("main函数内num = %d\n", num);
return 0;
}
运行结果:
test函数内num = 200
main函数内num = 100
解析:
1. 全局变量作用域为整个程序,局部变量仅在定义的函数/块内有效;
2. 当局部变量与全局变量同名时,局部变量覆盖全局变量;
3. 若test函数内无局部num,会输出全局变量的100。
例题4:变量常见错误排查(未初始化/命名错误)
找出以下程序的错误并修正,写出正确代码和运行结果。
// 错误代码
#include
int main() {
// 错误1:变量命名含非法字符
int stu-age = 18;
// 错误2:变量未初始化
int score;
printf("年龄:%d,分数:%d\n", stu-age, score);
return 0;
}
修正后代码:
#include
int main() {
// 修正1:变量名改为合法格式
int stu_age = 18;
// 修正2:变量初始化
int score = 90;
printf("年龄:%d,分数:%d\n", stu_age, score);
return 0;
}
运行结果:
年龄:18,分数:90
解析:
1. 变量命名不能包含减号(-),需改为下划线(_)或其他合法形式;
2. 未初始化的局部变量值为随机数,必须先赋值再使用;
3. 全局变量未初始化时默认值为0,局部变量无默认值(高频考点)。
例题5:常量与变量的本质区别(值可修改性)
分析以下程序的错误原因,说明常量与变量的核心差异。
#include
#define MAX 100 // 符号常量
int main() {
int num = 50; // 变量
// 尝试修改常量和变量
MAX = 200; // 错误
num = 150; // 正确
printf("MAX=%d, num=%d\n", MAX, num);
return 0;
}
错误原因:
程序编译报错,提示“赋值给只读变量‘MAX’”
修正后代码:
#include
#define MAX 100
int main() {
int num = 50;
// 注释掉修改常量的代码
// MAX = 200;
num = 150;
printf("MAX=%d, num=%d\n", MAX, num);
return 0;
}
运行结果:
MAX=100, num=150
解析:
1. 常量(符号常量/字面常量)的核心特性是
值不可修改,变量的值可随时修改;
2. 符号常量由#define定义,编译时直接替换,无内存地址,无法赋值;
3. 变量在内存中占用存储空间,可通过赋值语句修改值。