S1-2.1
C 语言的基本数据类型及定义方法。
标识符命名规则与三类标识符
必记- 合法字符集:标识符只能由字母(A~Z、a~z)、数字(0~9)和下划线(
_)组成,且首字符必须是字母或下划线,绝不能以数字开头。 - 大小写敏感:C 语言严格区分大小写,如
score、Score与SCORE是三个不同的标识符;关键字必须全部小写(如int、return、sizeof)。 - 三类标识符:① 关键字(32 个,有固定语法含义,不可作变量名,如
int, if, else, for, while, do, switch, case, break, continue, default, sizeof, static, extern);② 预定义标识符(库函数名或预处理命令如printf, scanf, define, include,语法允许重定义但严禁重名);③ 用户标识符(自定义的变量名、函数名、结构体名)。
C 语言数据类型体系导图
重点C 语言数据类型
基本类型(算术类型)
- 整型:short (2B)、int (4B)、long (4B),均可配 signed / unsigned
- 字符型:char (1B,内存中存 ASCII 码整数,可参与算术运算)
- 实型(浮点型):float 单精度 (4B,6~7 位有效数字)、double 双精度 (8B,15~16 位有效数字)
构造类型(聚合类型)
- 数组类型
type arr[N]、结构体struct、共用体union、枚举enum
- 数组类型
指针类型
type *p(32 位环境下任意指针变量本身占 4 字节)空类型
void(无返回值函数或通用指针void *)
基本数据类型字节数、取值范围与常量表示(32 位标准环境)
必记字符型
- 关键字
char/unsigned char- 字节数 (sizeof)
- 1 字节 (8 bit)
- 常见表示与考试必记要点
- 有符号
-128 ~ 127,无符号0 ~ 255;'A'=65, 'a'=97, '0'=48,大小写相差 32
短整型
- 关键字
short [int]- 字节数 (sizeof)
- 2 字节 (16 bit)
- 常见表示与考试必记要点
- 有符号
-32768 ~ 32767,无符号0 ~ 65535
基本整型
- 关键字
int/unsigned int- 字节数 (sizeof)
- 4 字节 (32 bit)
- 常见表示与考试必记要点
- 十进制
123、八进制以0开头(如017合法,018非法)、十六进制以0x/0X开头(如0x1A)
单精度实型
- 关键字
float- 字节数 (sizeof)
- 4 字节 (32 bit)
- 常见表示与考试必记要点
- 小数形式
3.14f;指数形式aEn或aen要求 E 前必有数、E 后必为整数(如1.2e-3合法,e3、2e1.5非法)
双精度实型
- 关键字
double- 字节数 (sizeof)
- 8 字节 (64 bit)
- 常见表示与考试必记要点
- C 语言中实型常量(如
3.14)默认按double存储和运算
| 数据类型 | 关键字 | 字节数 (sizeof) | 常见表示与考试必记要点 |
|---|---|---|---|
| 字符型 | char / unsigned char | 1 字节 (8 bit) | 有符号 -128 ~ 127,无符号 0 ~ 255;'A'=65, 'a'=97, '0'=48,大小写相差 32 |
| 短整型 | short [int] | 2 字节 (16 bit) | 有符号 -32768 ~ 32767,无符号 0 ~ 65535 |
| 基本整型 | int / unsigned int | 4 字节 (32 bit) | 十进制 123、八进制以 0 开头(如 017 合法,018 非法)、十六进制以 0x/0X 开头(如 0x1A) |
| 单精度实型 | float | 4 字节 (32 bit) | 小数形式 3.14f;指数形式 aEn 或 aen 要求 E 前必有数、E 后必为整数(如 1.2e-3 合法,e3、2e1.5 非法) |
| 双精度实型 | double | 8 字节 (64 bit) | C 语言中实型常量(如 3.14)默认按 double 存储和运算 |
高频转义字符与字符串存储区别
必记'\n' / '\t' / '\r'
- 含义与 ASCII
- 换行(10) / 水平制表(9) / 回车(13)
- 典型示例
printf("a\tb\n");- 易错区分
- 每个转义字符无论写几个符号都只算 1 个字符
'\\' / '\'' / '\"'
- 含义与 ASCII
- 反斜杠
\/ 单引号'/ 双引号" - 典型示例
char c = '\'';- 易错区分
- 在路径字符串中写双反斜杠:
"C:\\test\\a.txt"
'\0' vs '0'
- 含义与 ASCII
- 空字符(ASCII 0) vs 数字字符(ASCII 48)
- 典型示例
"a"占 2 字节('a'与末尾隐含'\0')- 易错区分
- 字符
'a'占 1B;字符串"a"含结束标志'\0'占 2B
'\ddd' / '\xhh'
- 含义与 ASCII
- 1~3 位八进制 / 1~2 位十六进制转义
- 典型示例
'\101'即'A'(65),'\x41'即'A'- 易错区分
- 八进制转义中不能出现
8或9(如'\018'错误)
| 转义形式 | 含义与 ASCII | 典型示例 | 易错区分 |
|---|---|---|---|
'\n' / '\t' / '\r' | 换行(10) / 水平制表(9) / 回车(13) | printf("a\tb\n"); | 每个转义字符无论写几个符号都只算 1 个字符 |
'\\' / '\'' / '\"' | 反斜杠 \ / 单引号 ' / 双引号 " | char c = '\''; | 在路径字符串中写双反斜杠:"C:\\test\\a.txt" |
'\0' vs '0' | 空字符(ASCII 0) vs 数字字符(ASCII 48) | "a" 占 2 字节('a' 与末尾隐含 '\0') | 字符 'a' 占 1B;字符串 "a" 含结束标志 '\0' 占 2B |
'\ddd' / '\xhh' | 1~3 位八进制 / 1~2 位十六进制转义 | '\101' 即 'A'(65),'\x41' 即 'A' | 八进制转义中不能出现 8 或 9(如 '\018' 错误) |
高频易错:符号常量 #define 与结构体 sizeof 双口径(对应复核项 30613)
必记易错陷阱
① #define PI 3.14 是宏替换预处理指令,末尾绝不能加分号,仅做文本替换不做语法检查;const double pi = 3.14; 才是有类型的常变量。<br>② 结构体 sizeof 双口径:若题目不计内存对齐,按各成员字节数紧凑累加(如 int a[2]; char ch[10]; float s; double f; 累加为 8+10+4+8 = 30 字节);若按 32 位/VC 默认对齐,char ch[10] 后补齐 2 字节,整体 sizeof 为 32 字节;而任意类型的结构体指针变量本身在 32 位下恒占 4 字节。
随堂自测(3 题 · 共 268 道关联题)展开作答
38 在C语言中,表示逻辑“真”值用( )。
在32位机器上,int型数据占____个字节。
____指在程序运行过程中不改变的量。
S1-2.2
C 语言运算符的种类、运算优先级和结合性。
C 语言核心运算符优先级与结合性总表(由高到低)
必记第 1 梯队(最高)
- 运算符类别
- 初等运算符
- 代表运算符
()圆括号、[]数组下标、->、.成员- 结合方向与必记口诀
- 自左向右;括号优先级永远最高
第 2 梯队
- 运算符类别
- 单目运算符
- 代表运算符
!、++、--、-(负号)、&(取址)、*(解引用)、(type)、sizeof- 结合方向与必记口诀
- 自右向左(单目、条件、赋值三大类均为右结合)
第 3 梯队
- 运算符类别
- 算术运算符
- 代表运算符
- 先
* / %,后+ - - 结合方向与必记口诀
- 自左向右;求余
%两侧操作数必须全为整型
第 4 梯队
- 运算符类别
- 关系运算符
- 代表运算符
- 先
> >= < <=,后== != - 结合方向与必记口诀
- 自左向右;结果只有真(
1)或假(0)
第 5 梯队
- 运算符类别
- 逻辑运算符(不含
!) - 代表运算符
- 先逻辑与
&&,后逻辑或|| - 结合方向与必记口诀
- 自左向右;注意单目逻辑非
!在第 2 梯队,远高于算术和关系
第 6 梯队
- 运算符类别
- 条件运算符(唯一三目)
- 代表运算符
表达式1 ? 表达式2 : 表达式3- 结合方向与必记口诀
- 自右向左;如
a>b ? a : c>d ? c : d等价于a>b ? a : (c>d ? c : d)
第 7 梯队
- 运算符类别
- 赋值与复合赋值
- 代表运算符
= += -= *= /= %=- 结合方向与必记口诀
- 自右向左;左操作数必须是可修改的变量(左值)
第 8 梯队(最低)
- 运算符类别
- 逗号运算符
- 代表运算符
表达式1, 表达式2, ..., 表达式n- 结合方向与必记口诀
- 自左向右依次求值,整个表达式取最后一个表达式的值
| 优先级梯队 | 运算符类别 | 代表运算符 | 结合方向与必记口诀 |
|---|---|---|---|
| 第 1 梯队(最高) | 初等运算符 | () 圆括号、[] 数组下标、->、. 成员 | 自左向右;括号优先级永远最高 |
| 第 2 梯队 | 单目运算符 | !、++、--、-(负号)、&(取址)、*(解引用)、(type)、sizeof | 自右向左(单目、条件、赋值三大类均为右结合) |
| 第 3 梯队 | 算术运算符 | 先 * / %,后 + - | 自左向右;求余 % 两侧操作数必须全为整型 |
| 第 4 梯队 | 关系运算符 | 先 > >= < <=,后 == != | 自左向右;结果只有真(1)或假(0) |
| 第 5 梯队 | 逻辑运算符(不含 !) | 先逻辑与 &&,后逻辑或 || | 自左向右;注意单目逻辑非 ! 在第 2 梯队,远高于算术和关系 |
| 第 6 梯队 | 条件运算符(唯一三目) | 表达式1 ? 表达式2 : 表达式3 | 自右向左;如 a>b ? a : c>d ? c : d 等价于 a>b ? a : (c>d ? c : d) |
| 第 7 梯队 | 赋值与复合赋值 | = += -= *= /= %= | 自右向左;左操作数必须是可修改的变量(左值) |
| 第 8 梯队(最低) | 逗号运算符 | 表达式1, 表达式2, ..., 表达式n | 自左向右依次求值,整个表达式取最后一个表达式的值 |
算术运算与自增自减(++ / --)必记铁律
必记- 整数相除截断小数:两个整型相除结果仍为整型(向零取整),如
5 / 22、-5 / 2-2;只要有一侧为浮点型则为实数除法,如5.0 / 2 == 2.5。 - 求余
%符号规律:a % b的操作数必须全为整数(如5.0 % 2编译报错),且余数的正负号完全取决于被除数a,如-7 % 4 -3、7 % -4 3。 - 前置
++ivs 后置i++:单独成句时效果相同;嵌入表达式时,前置++i先自增 1 再用新值参与运算,后置i++先用原值参与运算、表达式取完值后再自增 1;++/--只能用于变量,不能用于常量或表达式(如5++、(a+b)++均非法)。
逻辑短路求值与连续自增陷阱(对应复核项 30260)
必记易错陷阱
① 逻辑与 && 短路:在 expr1 && expr2 中,若 expr1 为假(0),则 expr2 根本不会执行(例如 int a=0, b=1; (a++) && (++b); 执行后 a=1,而 b 仍为 1)。<br>② 逻辑或 || 短路:在 expr1 || expr2 中,若 expr1 为真(非 0),则 expr2 根本不会执行。<br>③ 同一变量连续自增(30260):标准 C 中同一表达式内对同一变量多次自增属未定义行为,但旧版等级考试若出现 int x=2; int a=(++x)+(++x);,通常按两次前置自增均完成后 x=4、a=8(或部分老题库按 x=2 连增计算)考查,写工程代码时严禁写出此类表达式。
随堂自测(3 题 · 共 398 道关联题)展开作答
52 以下程序的运行结果是 。 main() {int x,y,z; x=1;y=2;z=3; x=y--<=x||x+y!=z; printf("%d,%d",x,y); }
53 以下程序的运行结果是______。 main() {int a1,a2,b1,b2; int i=5,j=7,k=0; a1=!k; a2=i!=j; printf("a1=%d\ta2=%d\n",a1,a2); b1=k&&j; b2=k||j; printf("b1=%d\tb2=%d\n",b1,b2); }
96 以下程序的运行结果是______。 #include <stdio.h> main() {int a=-10,b=-3; printf("%d,",-a%b); printf("%d,",(a-b,a+b)); printf("%d\n",a-b?a-b:a+b); }
S1-2.3
不同类型数据间的转换与运算。
隐式自动类型转换与赋值转换规则
必记- 算术运算自动提升(向高精度看齐):不同类型数据混合运算时,纵向先把
char、short自动提升为int;横向按int→unsigned int→long→double由低向高自动转换(float参与运算时直接按双精度double处理)。 - 赋值自动转换(向等号左侧看齐):赋值运算
=两侧类型不同时,无条件将右侧表达式的值转换为左侧变量的类型。浮点型赋给整型会直接截断小数部分(不四舍五入),如int a = 3.9;结果a为3。
显式强制类型转换 (类型名)表达式 示例
重点#include <stdio.h>
int main(void) {
double x = 3.8;
int a = (int)x + 2; /* (int)x 得到临时值 3,x 本身仍为 3.8 */
int b = (int)(x + 2.5); /* 先算 3.8 + 2.5 = 6.3,再强转为 6 */
printf("x=%.1f, a=%d, b=%d\n", x, a, b);
return 0;
}强制类型转换两大必考陷阱
必记易错陷阱
① 语法写法:类型名必须加括号,写成 (int)x 正确,写成 int(x) 在纯 C 中语法错误。<br>② 原变量不变:强制转换 (int)x 仅产生一个临时的整型中间值,变量 x 自身的数据类型和存储值均不发生任何改变;且 (int)x + y 只强转 x(因单目 (type) 优先级高于 +)。
随堂自测(3 题 · 共 145 道关联题)展开作答
若有语句“double x=15; int y;”,当执行“y=(int)(sqrt(x/4))%3”之后 y 的值是____.
语句 double g=9.8; int a=(int)g*3; 执行后, g 的值为 ____。
若有定义语句:int x=12,y=8,z;,在其后执行语句z=0.9+x/y,则z的值为____。
S1-2.4
C 语言表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。
六大类表达式求值规则与高频考题对照
必记赋值与复合赋值
- 语法与求值规则
- 右结合;复合赋值右侧整体自动加括号
- 经典真题示例(设初值
int a=3, b=4, c=5;) a += a -= a * a(设初值a=6):先算a -= 36得a=-30,再算a += -30得-60- 容易踩坑点
a *= b + c等价于a = a * (b + c),绝不是a * b + c
关系表达式
- 语法与求值规则
- 成立值为
1,不成立值为0 - 经典真题示例(设初值
int a=3, b=4, c=5;) c > b > a:先算c > b得1,再算1 > a(即1 > 3)结果为0- 容易踩坑点
- 数学连等
1 <= x <= 10在 C 中恒为真(1),应写x >= 1 && x <= 10
逻辑表达式
- 语法与求值规则
- 非 0 即真,0 即假;结果仅
1或0 - 经典真题示例(设初值
int a=3, b=4, c=5;) !(a + b) + c - 1 && b + c / 2:!(7)为0,0+5-1=4(真),右侧4+2=6(真),结果为1- 容易踩坑点
- 注意赋值
=与相等==:if (a = 0)会把 0 赋给a且恒判为假
条件表达式
- 语法与求值规则
e1 ? e2 : e3(右结合)- 经典真题示例(设初值
int a=3, b=4, c=5;) a < b ? a : c结果为3- 容易踩坑点
- 只会计算被选中的那个分支,未选中分支中的
++不会执行
逗号表达式
- 语法与求值规则
e1, e2, ..., en(优先级最低)- 经典真题示例(设初值
int a=3, b=4, c=5;) x = (a = 3, 6 * 3)则x=18;而x = a = 3, 6 * 3则 ==x=3==- 容易踩坑点
- 无括号时赋值
=优先级高于逗号,
| 表达式类型 | 语法与求值规则 | 经典真题示例(设初值 int a=3, b=4, c=5;) | 容易踩坑点 |
|---|---|---|---|
| 赋值与复合赋值 | 右结合;复合赋值右侧整体自动加括号 | a += a -= a * a(设初值 a=6):先算 a -= 36 得 a=-30,再算 a += -30 得 -60 | a *= b + c 等价于 a = a * (b + c),绝不是 a * b + c |
| 关系表达式 | 成立值为 1,不成立值为 0 | c > b > a:先算 c > b 得 1,再算 1 > a(即 1 > 3)结果为 0 | 数学连等 1 <= x <= 10 在 C 中恒为真(1),应写 x >= 1 && x <= 10 |
| 逻辑表达式 | 非 0 即真,0 即假;结果仅 1 或 0 | !(a + b) + c - 1 && b + c / 2:!(7) 为 0,0+5-1=4(真),右侧 4+2=6(真),结果为 1 | 注意赋值 = 与相等 ==:if (a = 0) 会把 0 赋给 a 且恒判为假 |
| 条件表达式 | e1 ? e2 : e3(右结合) | a < b ? a : c 结果为 3 | 只会计算被选中的那个分支,未选中分支中的 ++ 不会执行 |
| 逗号表达式 | e1, e2, ..., en(优先级最低) | x = (a = 3, 6 * 3) 则 x=18;而 x = a = 3, 6 * 3 则 ==x=3== | 无括号时赋值 = 优先级高于逗号 , |
复合赋值与逗号表达式求值验证
重点#include <stdio.h>
int main(void) {
int a = 6, x, y;
a += a -= a * a;
x = (y = 3, y + 5);
printf("a=%d, x=%d, y=%d\n", a, x, y);
return 0;
}随堂自测(3 题 · 共 443 道关联题)展开作答
46 若有以下定义,int m=5,y=2;则计算表达式y+=y-=m*=y后y的值是【 】。
50 条件“2<x<3或x<-10”的C语言表达式是( )。
64 以下程序的运行结果是______。 main() {if (2*2==5<2*2==4) printf("T"); else printf("F"); }