知识点精讲
一、基本数据类型分类
C语言核心基本数据类型分为三大类,是程序存储数据的基础,不同类型占用内存和取值范围不同:
类型分类
具体类型
占用内存(字节)
取值范围
输出格式符
整型
short(短整型)
2
-32768 ~ 32767
%hd
int(整型)
4
-2¹⁵ ~ 2¹⁵-1
%d
long(长整型)
4/8
-2³¹ ~ 2³¹-1
%ld
字符型
char
1
0 ~ 127(ASCII码)
%c(字符)/%d(ASCII码)
浮点型
float(单精度)
4
±3.4×10³⁸(6~7位有效数字)
%f
double(双精度)
8
±1.7×10³⁰⁸(15~16位有效数字)
%lf(输入)/%f(输出)
核心规则 :
1. 整型用于存储整数,字符型本质是存储ASCII码的整型,浮点型用于存储小数;
2. 占用内存越大,取值范围越广,精度越高(浮点型);
3. 无符号整型(unsigned)仅存储非负数,取值范围为 0 ~ 2ⁿ-1(n为位数)。
二、变量定义与初始化
变量是存储数据的容器,定义格式为「数据类型 变量名;」,初始化是定义时赋值:
1. 标准定义格式
// 单个变量定义
int age; // 定义整型变量age
char gender; // 定义字符型变量gender
float score; // 定义浮点型变量score
double pi; // 定义双精度浮点型变量pi
// 多个同类型变量定义(逗号分隔)
int a, b, c; // 同时定义3个整型变量
char ch1, ch2; // 同时定义2个字符型变量
2. 变量初始化
// 定义时直接赋值(推荐)
int num = 10; // 整型变量初始化
char ch = 'A'; // 字符型变量初始化(单引号)
float price = 9.9; // 浮点型变量初始化
double height = 175.5; // 双精度浮点型初始化
// 先定义后赋值
int count;
count = 5; // 赋值操作
3. 命名规则(高频考点)
由字母、数字、下划线组成,且不能以数字开头
区分大小写(如num和Num是不同变量)
不能使用C语言关键字(如int、char、float等)
// 合法命名
int stu_score; // 字母+下划线
int _num; // 下划线开头
int a123; // 字母+数字
// 非法命名
int 123a; // 数字开头(错误)
int int; // 使用关键字(错误)
int stu-score; // 包含减号(错误)
三、输入与输出(核心考点)
使用printf()输出、scanf()输入,需匹配对应格式符,是考试最高频考点:
1. 整型输入输出
#include
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num); // 输入整型,&是取地址符(必加)
printf("你输入的整数是:%d\n", num);
return 0;
}
2. 字符型输入输出
#include
int main() {
char ch;
printf("请输入一个字符:");
scanf("%c", &ch); // 字符型输入,格式符%c
// 两种输出方式:字符形式 / ASCII码形式
printf("字符形式:%c\n", ch);
printf("ASCII码形式:%d\n", ch);
return 0;
}
3. 浮点型输入输出(精度控制)
#include
int main() {
float f_num;
double d_num;
printf("请输入两个小数(用空格分隔):");
scanf("%f %lf", &f_num, &d_num); // float用%f,double输入用%lf
// 输出精度控制:%.2f 表示保留2位小数
printf("单精度浮点型:%.2f\n", f_num);
printf("双精度浮点型:%.3f\n", d_num); // double输出用%f
return 0;
}
4. 格式符速查表(必考)
数据类型
输出格式符
输入格式符
示例
int
%d
%d
printf("%d", 10);
char
%c(字符)/%d(ASCII)
%c
printf("%c", 'A');
float
%f
%f
printf("%.2f", 3.14);
double
%f
%lf
scanf("%lf", &d_num);
四、数据类型转换(高频考点)
分为自动转换(隐式)和强制转换(显式),核心是精度匹配:
1. 自动类型转换(低精度→高精度)
#include
int main() {
int a = 5;
float b = 2.5;
// 自动转换:int→float,结果为浮点型
float res = a + b; // 5 + 2.5 = 7.5
printf("结果:%f\n", res);
return 0;
}
2. 强制类型转换(高精度→低精度)
#include
int main() {
double num = 3.99;
// 强制转换:double→int,直接截断小数部分(不是四舍五入)
int res = (int)num; // 结果为3(不是4)
printf("结果:%d\n", res);
// 示例2:浮点型转整型的精度丢失
float f = 10.8;
int i = (int)f; // 结果为10
printf("转换后:%d\n", i);
return 0;
}
3. 转换规则(必考)
自动转换:char → int → float → double(精度递增)
强制转换格式:(目标类型) 变量/表达式
强制转换仅临时改变类型,原变量类型不变
高精度转低精度会丢失精度(浮点→整型截断小数)
五、常见错误(高频考点)
格式符不匹配 :用%d输出浮点型(如printf("%d", 3.14))
scanf缺少& :scanf("%d", num)(整型/字符型输入必须加&)
字符赋值错误 :char ch = "A";(字符需用单引号,双引号是字符串)
关键字命名 :int float;(使用C语言关键字作为变量名)
浮点型输入错误 :scanf("%lf", &f_num);(float输入需用%f,不是%lf)
// 错误示例1:格式符不匹配
#include
int main() {
float score = 95.5;
printf("成绩:%d\n", score); // 错误:%d不能输出浮点型,应使用%f
return 0;
}
// 错误示例2:scanf缺少&
#include
int main() {
int age;
scanf("%d", age); // 错误:缺少&,应改为&age
printf("年龄:%d\n", age);
return 0;
}
例题精选
例题1:变量定义与命名规则(基础考点)
以下变量命名合法的是?写出合法/非法原因,并定义一个合法的整型变量、字符型变量、浮点型变量。
#include
int main() {
// 请判断并定义合法变量
int 1num; // 待判断
char ch-1; // 待判断
float _price;// 待判断
// 正确定义示例
int stu_age;
char gender = 'M';
float height = 172.5;
printf("变量定义完成\n");
return 0;
}
显示结果与解析
合法性判断:
1. int 1num; → 非法(数字开头)
2. char ch-1; → 非法(包含减号)
3. float _price; → 合法(下划线开头,符合命名规则)
运行结果:
若直接运行原代码,编译器报错(非法命名);修正后运行输出:变量定义完成
解析:
1. 变量命名只能由字母、数字、下划线组成,且不能以数字开头;
2. 不能包含特殊符号(如-、+、*等);
3. 定义变量时可初始化,也可先定义后赋值(推荐初始化,避免随机值)。
例题2:字符型输入输出与ASCII码(核心考点)
输入一个字符,分别输出其字符形式和ASCII码形式,如输入'A',输出"A"和65。
#include
int main() {
char ch;
printf("请输入一个字符:");
scanf("%c", &ch);
printf("字符形式:%c\n", ch);
printf("ASCII码形式:%d\n", ch);
return 0;
}
显示结果与解析
运行结果(输入示例:B):
请输入一个字符:B
字符形式:B
ASCII码形式:66
解析:
1. 字符型变量本质存储的是ASCII码(0-127的整数),%c输出字符,%d输出对应ASCII码;
2. 常用ASCII码:'0'=48、'A'=65、'a'=97、空格=32、换行=10;
3. 输入字符时,scanf("%c", &ch) 中的&不能省略(字符型输入必须加取地址符)。
例题3:浮点型输入输出与精度控制(高频考点)
输入一个单精度浮点型数字(如98.7654),分别输出保留1位、2位、3位小数的结果。
#include
int main() {
float num;
printf("请输入一个小数:");
scanf("%f", &num);
printf("保留1位小数:%.1f\n", num);
printf("保留2位小数:%.2f\n", num);
printf("保留3位小数:%.3f\n", num);
return 0;
}
显示结果与解析
运行结果(输入示例:98.7654):
请输入一个小数:98.7654
保留1位小数:98.8
保留2位小数:98.77
保留3位小数:98.765
解析:
1. float类型输入用%f,输出也用%f;double输入用%lf,输出用%f;
2. %.nf 表示保留n位小数,遵循四舍五入规则;
3. 单精度浮点型有效数字约6~7位,超过会丢失精度(如输入98.7654321,保留3位仍为98.765)。
例题4:自动类型转换(核心考点)
计算 5 + 2.5 的结果,分析类型转换过程,并输出结果类型和值。
#include
int main() {
int a = 5;
float b = 2.5;
float res = a + b;
// 输出结果(%f匹配浮点型)
printf("5 + 2.5 = %f\n", res);
return 0;
}
显示结果与解析
运行结果:
5 + 2.5 = 7.500000
解析:
1. 类型转换过程:int型变量a(5)自动转换为float型(5.0),再与b(2.5)相加;
2. 自动转换规则:低精度→高精度(char→int→float→double),避免精度丢失;
3. 结果res为float型,输出时%f会默认保留6位小数(7.500000),可通过%.1f简化为7.5。
例题5:强制类型转换(高频考点)
将双精度浮点型变量 9.99 强制转换为整型,输出转换前后的值,分析精度变化。
#include
int main() {
double num = 9.99;
printf("转换前(double):%f\n", num);
// 强制转换为int,截断小数部分
int res = (int)num;
printf("转换后(int):%d\n", res);
return 0;
}
显示结果与解析
运行结果:
转换前(double):9.990000
转换后(int):9
解析:
1. 强制转换格式:(目标类型) 变量,此处(int)num将double型转为int型;
2. 浮点型转整型直接截断小数部分(不是四舍五入),所以9.99→9;
3. 强制转换仅临时改变num的类型,原变量num仍为double型(值还是9.99);
4. 若需四舍五入,需手动处理:(int)(num + 0.5) → 9.99+0.5=10.49 → 转换为10。
例题6:输入输出常见错误修正(必考)
修正以下代码的错误,使其能正确输入输出整型和浮点型变量。
#include
int main() {
int age;
float weight;
// 错误1:scanf缺少&
scanf("%d", age);
// 错误2:float输入用%lf(应为%f)
scanf("%lf", &weight);
// 错误3:格式符不匹配(%d输出浮点型)
printf("年龄:%d,体重:%d\n", age, weight);
return 0;
}
显示结果与解析
修正后代码:
#include
int main() {
int age;
float weight;
// 修正1:添加&
scanf("%d", &age);
// 修正2:float输入用%f
scanf("%f", &weight);
// 修正3:浮点型用%f输出
printf("年龄:%d,体重:%.1f\n", age, weight);
return 0;
}
运行结果(输入:18 55.5):
年龄:18,体重:55.5
解析:
1. scanf输入整型/字符型/浮点型变量时,必须加取地址符&;
2. float输入用%f,double输入用%lf,输出均用%f;
3. 输出格式符必须与变量类型匹配(%d→int,%f→float/double,%c→char);
4. 修正后的代码是考试最常考的"格式符匹配+scanf取地址"综合题型。