←

C 语言程序设计 · C语言

数据类型及其运算

数据类型及其运算

结构化讲义

S1-2 · 4 个大纲考点讲义 · 已精编

练本节题目

S1-2.1

C 语言的基本数据类型及定义方法。

精编讲义 v1#

标识符命名规则与三类标识符

必记
  • 合法字符集:标识符只能由字母(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 存储和运算

高频转义字符与字符串存储区别

必记

'\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' 错误)

高频易错:符号常量 #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 道关联题)展开作答
填空2 分自测不计入学习进度

38 在C语言中,表示逻辑“真”值用( )。

填空2 分自测不计入学习进度

在32位机器上,int型数据占____个字节。

填空2 分自测不计入学习进度

____指在程序运行过程中不改变的量。

S1-2.2

C 语言运算符的种类、运算优先级和结合性。

精编讲义 v1#

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
结合方向与必记口诀
自左向右依次求值,整个表达式取最后一个表达式的值

算术运算与自增自减(++ / --)必记铁律

必记
  • 整数相除截断小数:两个整型相除结果仍为整型(向零取整),如 5 / 2 2、-5 / 2 -2;只要有一侧为浮点型则为实数除法,如 5.0 / 2 == 2.5。
  • 求余 % 符号规律:a % b 的操作数必须全为整数(如 5.0 % 2 编译报错),且余数的正负号完全取决于被除数 a,如 -7 % 4 -3、7 % -4 3。
  • 前置 ++i vs 后置 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 道关联题)展开作答
填空2 分自测不计入学习进度

52 以下程序的运行结果是 。 main() {int x,y,z; x=1;y=2;z=3; x=y--<=x||x+y!=z; printf("%d,%d",x,y); }

填空2 分自测不计入学习进度

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); }

填空2 分自测不计入学习进度

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

不同类型数据间的转换与运算。

精编讲义 v1#

隐式自动类型转换与赋值转换规则

必记
  • 算术运算自动提升(向高精度看齐):不同类型数据混合运算时,纵向先把 char、short 自动提升为 int;横向按 int → unsigned int → long → double 由低向高自动转换(float 参与运算时直接按双精度 double 处理)。
  • 赋值自动转换(向等号左侧看齐):赋值运算 = 两侧类型不同时,无条件将右侧表达式的值转换为左侧变量的类型。浮点型赋给整型会直接截断小数部分(不四舍五入),如 int a = 3.9; 结果 a 为 3。

显式强制类型转换 (类型名)表达式 示例

重点
c
#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 道关联题)展开作答
填空2 分自测不计入学习进度

若有语句“double x=15; int y;”,当执行“y=(int)(sqrt(x/4))%3”之后 y 的值是____.

填空2 分自测不计入学习进度

语句 double g=9.8; int a=(int)g*3; 执行后, g 的值为 ____。

综合6 分自测不计入学习进度

若有定义语句:int x=12,y=8,z;,在其后执行语句z=0.9+x/y,则z的值为____。

S1-2.4

C 语言表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。

精编讲义 v1#

六大类表达式求值规则与高频考题对照

必记

赋值与复合赋值

语法与求值规则
右结合;复合赋值右侧整体自动加括号
经典真题示例(设初值 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==
容易踩坑点
无括号时赋值 = 优先级高于逗号 ,

复合赋值与逗号表达式求值验证

重点
c
#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 道关联题)展开作答
填空2 分自测不计入学习进度

46 若有以下定义,int m=5,y=2;则计算表达式y+=y-=m*=y后y的值是【 】。

填空2 分自测不计入学习进度

50 条件“2<x<3或x<-10”的C语言表达式是( )。

填空2 分自测不计入学习进度

64 以下程序的运行结果是______。 main() {if (2*2==5<2*2==4) printf("T"); else printf("F"); }