2027 天津软件学院专升本 · 第二章 数据类型和运算符(讲义 P13-42 全覆盖)
答题进度
0/0
首页 第一章 第二章 答题测试 第三章

一变量和常量

对应讲义正文第 13 页
  • 变量:用于保存数据,在程序运行过程中变量的值可以改变,系统会为该变量分配内存空间。
  • 常量:在程序运行过程中,常量的值无法修改。
定义变量的格式:数据类型名 变量名;
例 1:int a = 2; 的含义

定义一个 int 型(整型)变量 a,并且给它赋一个初值 2。

例 2:int a; 未被赋值,变量里面是什么?
答案:随机值
例 3:执行 int a = 5; a = 3; 后,a 的值为?
答案:3(后面的赋值覆盖了前面的值)
例 4:执行 int a = 3; a = a+2; 后,a 的值为?
答案:5
输出变量的值:用 printf 输出变量的值需要用格式控制符。
例:int a=2, b=3; printf("%d,%d\n", a, b); 输出 2,3

二整型

对应讲义正文第 13-16 页

在 C 语言中,简单数据类型包括整型、实型、字符型。整型即整数,在 C 语言中,十进制整型采用补码的形式表示。

1. 整型常量

C 语言能表示的进制数包括十进制(默认)、八进制和十六进制,注意 C 语言不能表示二进制数。

进制表示方法格式控制符示例
十进制(默认)直接书写%dint a = 23;
八进制前导 0(数字零)%oint a = 023;
十六进制前导 0x 或 0X%x / %Xint a = 0x5ab;
注意:定义有前导,输出无前导。以 %x 输出为小写,以 %X 输出为大写。
例 4:printf("%d,%d\n", 023, 0x23); 的输出结果

023 = 2×8+3 = 19;0x23 = 2×16+3 = 35

答案:19,35
例 5:printf("%o,%x\n", 50, 50); 的输出结果
答案:62,32(50 = 6×8+2 = 3×16+2)

2. 整型变量

用于定义整型变量的 3 个关键字:int(基本整型)、short(短整型)、long(长整型)。

  • 假设 int 占 2 个字节,其能表示的整数范围为 -32768 ~ 32767(VC 下 int 占 4 字节)。
  • 十进制整数在计算机中以补码的形式存储。
  • 长整型输出格式控制符为 %ld。
例 3:int a = -1; printf("%d,%o,%x\n", a, a, a); 的输出结果

-1 的 16 位补码为 1111 1111 1111 1111

答案:-1,177777,ffff
例 4:int a = 32767; a = a+1; 输出结果(溢出)

a 已是 int 型(2 字节)能表示的最大值,再加 1 不会得到 32768,而是 -32768,这样的情况叫做"溢出"。

答案:-32768

3. 无符号数(unsigned)

定义无符号数的关键字是 unsigned。假设 int 占 2 个字节,unsigned int 型能表示整数的范围为 0 ~ 65535,不能表示负数。无符号输出格式控制符为 %u。

假设 int 型占 2 个字节:
① 整数 -1 以 %u 形式输出得 65535;
② 无符号数 65535 以 %d 输出得 -1。
例 8:unsigned int a = 65535; a = a+1; printf("%u\n", a); 的输出结果
答案:0(无符号数溢出回到 0)

三实型

对应讲义正文第 17-18 页

1. 实型常量

实型常量包括小数形式和指数形式。

  • 小数形式:必须要有小数点。".5" 等价于 "0.5","5." 也是合法实型。
  • 指数形式:由 e 或 E 加数字组成,e 或 E 的两边必须有数字;e 或 E 的右边必须是整数(可以加 +、- 号),不能是小数。
例:2e-3 = 2×10-3;1.5E+6 = 1.5×106
例 4:合法的实型常量是( )A. 05 B. 1.5e C. .3E-2 D. 3.5E2.5

A 是八进制整型;B 的 e 右边无数字;D 的 e 右边是小数。

答案:C
例 5:合法的常量是( )A. 2,000 B. 018 C. .5 D. 2e-3.0

A 不能有逗号;B 八进制不能出现 8;D 的 e 右边是小数。

答案:C(小数点前数字可省略)
例 6:合法的常量是( )A. e5 B. 0xE2 C. 3.e D. 0.3e5.0

A 的 e 左边无数字;C 的 e 右边无数字;D 的 e 右边是小数。

答案:B

2. 实型变量

关键字类型字节数格式控制符
float单精度浮点4%f
double双精度浮点8%lf
注意:用 %f 和 %lf 输出实型数据时,默认显示保留六位小数。
例 1:float a = 12.345; printf("a=%f\n", a); 的输出结果
答案:a=12.345000
例 2:%e 以指数形式输出

float a=31.415926, b=123.4, c=0.0567; 用 %e 输出:

答案:a=3.141593e+01 b=1.234000e+02 c=5.670000e-02

四字符型

对应讲义正文第 18-24 页

西文字符在计算机中以 ASCII 码的形式存储,存储一个字符占用一个字节。

字符0~9A~Za~z
ASCII 码(十进制)48~5765~9097~122

1. 字符常量

表示方法:用单引号括起来的单个字符
  • 'A'、'5'、'"'、' '(空格)都是合法的字符常量,'ab' 是不合法的字符常量。
  • ASCII 码值也是整数,可以用 %d 输出:printf("%d\n", 'A'); 输出 65。
  • 格式控制符 %c 表示字符原型;字符常量以原型输出时无单引号。
  • 注意整数 2 和字符 '2' 的不同:2 与 50。

2. 转义字符常量

转义字符常量的特点是以 "\" 开头。'n' 是普通字符常量,'\n' 是转义字符常量,其作用是换行。

转义字符功能转义字符功能
\n换行\\表示反斜杠 \
\t跳格(跳到下一个制表位)\'表示单引号 '
\b退格\"表示双引号 "
\ddd1 到 3 位八进制 ASCII 码表示的一个字符\xhh1 到 2 位十六进制 ASCII 码表示的一个字符
例 3:printf("%c,%c\n", '\101', '\x42'); 的输出结果

'\101' 八进制 101 = 65 = 'A';'\x42' 十六进制 42 = 66 = 'B'

答案:A,B
例 4:printf("%d,%d\n", '\0', '0'); 的输出结果

注意二者的不同之处:'\0' 是转义字符(值为 0),'0' 是数字字符(ASCII 为 48)。

答案:0,48
例 6:合法的字符常量为( )A. "a" B. 'xh' C. '\\' D. '\72'

A 是字符串;B 引号内有两个字符;D '\72' 中 7、2 是八进制数字,实为合法?——注意本题 D 写作 '\72' 为 1~3 位八进制转义,合法;但按讲义答案取 C(反斜杠的转义)。

答案:C
例 7:合法的字符常量为( )A. '\108' B. '\67' C. '\0' D. '2+3'

A 中 8 不是八进制数字;C '\0' 合法但题目取值为 B?——'\67' 是合法的八进制转义(1~3 位)。

答案:B
例 8:不合法的字符常量为( )A. '"' B. '\n' C. '\0x2e' D. '?'

'\0x2e' 中 \0 后不能再跟 x,十六进制转义应写作 '\x2e'。

答案:C

3. 字符串常量

表示方法:用双引号括起来
  • "xyj"、"0516"、"ab\nc\\"、""(空串)都是合法的字符串常量,'abcd' 不是合法的字符串常量。
  • 字符串常量 "ABCD" 存储时:A、B、C、D 后跟转义字符 '\0'(字符串结束标志),也占一个字节,共需 5 个字节。
  • 【sizeof】求数据或数据类型所占的字节数。
  • 【strlen】库函数,求字符串的长度(需 #include <string.h>)。
注意:求字符串所占字节数时,包括 \0。求字符串的长度时,不包括 \0。
例 3:int len = sizeof("ABCD"); 输出结果
答案:5(含结束标志 \0)
例 4:int len = strlen("ABCD"); 输出结果
答案:4(不含 \0)
例 5:以下字符串存储时所占的字节数

1) "Ab\\110\n" 2) "\\123\t\xffa" 3) "123,\4\"" 4) "\x41\n56"

答案:8、8、8、5 个字节(逐字符拆解:转义字符算 1 个,末尾加 \0)

4. 字符变量

关键字 char,占 1 个字节,表示的范围为 -128~127。char 型变量本质也是整型变量,因为 ASCII 码本身就是整数。

char ch1 = 'A';    // 用字符常量给字符变量赋值
char ch2 = 66;      // 用字符的 ASCII 码给字符变量赋值
printf("%c,%c\n", ch1, ch2);   // 输出 A,B
注意:① 对字符型变量赋值时,既可以用字符常量赋值,也可以使用 ASCII 码值赋值;
② 字符变量在做运算时本质是用其 ASCII 码值运算(如 'A'+32 得 'a','d'-'a'=3)。

5. 字符输入和输出函数

  • 【getchar】字符输入函数,从键盘获取一个字符:字符变量 = getchar();
  • 【putchar】字符输出函数,显示字符原型:putchar(字符常量或 ASCII 码值);
例:输入小写字母 a,输出大写字母
char ch;
printf("请输入一个小写英文字母:\n");
ch = getchar();   // 从键盘获取 a 赋给 ch
ch = ch-32;       // 小写转大写
printf("输出结果为:\n");
putchar(ch);
输出结果:A

五算术运算

对应讲义正文第 24-26 页
项目内容
运算符+、-、*、/(除法)、%(求余)
单目、双目、三目?双目运算符
优先级*、/、% 高于 + 和 -
结合性自左向右
注意:优先级指的是结合的优先次序,而不是计算的优先顺序。

1. 除法运算符 /

若 a 和 b 为整型,运算结果也为整型(舍去小数);a 和 b 其中有一个为实型,运算结果为实型。
例:写出下列表达式的运算结果

① 5/2 ② 10/3 ③ 2/3 ④ 3/2.0 ⑤ 3.0/2 ⑥ 6.0/2

答案:① 2 ② 3 ③ 0 ④ 1.5 ⑤ 1.5 ⑥ 3.0

2. 求余运算符 %

求余运算符的运算对象必须是整型,即 % 的两边必须为整型。求余运算结果的正负和 % 左边数字的正负保持一致。
例:a%b 是错误的式子(int a=3; float b=2.0;)

% 两边必须为整型,b 为实型,错误。同理 8.0%3 也是错误的式子。

例:写出下列表达式的运算结果

① 3%2 ② 7%3 ③ 8%2 ④ 2%5 ⑤ -5%3 ⑥ 6%-5

答案:① 1 ② 1 ③ 0 ④ 2 ⑤ -2 ⑥ 1(正负跟左边一致)

3. 重要结论

  • 判断整数的奇偶:若 n%2 == 0,则 n 为偶数;若 n%2 == 1,则 n 为奇数(== 的功能是判断 2 个数是否相等)。
  • 判断整除:若 n%k == 0,则 n 能被 k 整除。
  • 获取正整数 n 的各个位数(假设 n 为四位数): 个位数 n%10;十位数 n/10%10;百位数 n/100%10;千位数 n/1000;个位数+十位数 n%100。
例 4:n = 1989,求各位数字之和
int n = 1989;
int a,b,c,d,sum;
a = n%10;        // 表示个位数 9
b = n/10%10;    // 表示十位数 8
c = n/100%10;   // 表示百位数 8
d = n/1000;      // 表示千位数 1
sum = a+b+c+d;
printf("sum=%d\n", sum);
输出结果:sum=27
例 5:数学式对应的 C 语言表达式

① b²-4ac → b*b-4*a*c

② a/(bc) → a/(b*c) 或 a/b/c

六赋值运算

对应讲义正文第 26-29 页
项目内容
运算符=、+=、-=、*=、/=、%=
单目、双目、三目?双目运算符
优先级倒数第二,仅高于逗号运算符
结合性自右向左
注意:赋值运算符可以更改变量的值。赋值运算符的左边不能是表达式和常量。

1. 基础赋值运算符 =

形式:变量 = 值; 或 变量 = 表达式;
  • 语句 x+1 = 2; 不合法(左边是表达式);语句 3 = a+1; 不合法(左边是常量)。
  • 初始化:int a = 2; 定义变量 a 的同时赋予初值 2。
  • 语句 int a = b = 2; 不合法,C 语言不允许连等于初始化。两种正确写法: ① int a, b; a = b = 2; ② int a = 2, b = 2;
例 8:int a, b = 2; a = b+1.5; 输出 a 的值

2+1.5 = 3.5,赋给 int 型变量 a 时舍去小数部分

输出结果:a=3
例 9:借助第三个变量交换 a、b
int a = 2, b = 3, t;
t = a;   // 把 a 暂存到 t
a = b;
b = t;
printf("a=%d,b=%d\n", a, b);
输出结果:a=3,b=2
例 10:不借助第三个变量交换 a、b
int a = 2, b = 3;
a = a+b;   // a=5
b = a-b;   // b=2
a = a-b;   // a=3
printf("a=%d,b=%d\n", a, b);
输出结果:a=3,b=2

2. 复合赋值运算符 +=、-=、*=、/=、%=

例 1:等价形式

① a += 2 等价于 a = a+2

② a -= 2+b 等价于 a = a-(2+b)(右边整体先算)

③ a *= 3+2 等价于 a = a*(3+2)

例 2:int a = 1; a += 2; a += a; a *= 3; 输出结果

a=1 → a+=2 得 3 → a+=a 得 6 → a*=3 得 18

输出结果:a=18
例 3:int a; a += (a=5); 输出结果

a 先被赋值 5,再 a+=5

输出结果:a=10
例 4:int a = 3; a += a -= a*a; 输出结果

自右向左:a -= 9 得 a=-6;a += (-6) 得 -12

输出结果:a=-12
注意:只有赋值运算或者 ++、-- 运算才能改变变量的值。

七加加、减减运算

对应讲义正文第 29-32 页
项目内容
运算符++、--
单目、双目、三目?单目运算符
优先级正数第二
结合性自右向左
作用使变量的值加 1(或减 1)
注意:加加、减减的运算对象必须是变量,不能是常量和表达式。(a+2)++、5++ 均不合法。

在前的用法:先加 1(或减 1),再使用变量的值

例 4:int a = 2; printf("%d\n", ++a); 输出结果
输出结果:3
例 5:int a = 017; printf("%d\n", ++a); 输出结果

先进行进制转换(017 八进制 = 15),再处理加加

输出结果:16
例 6:int a = 2, b; b = ++a; 输出 a、b
输出结果:a=3,b=3

在后的用法:先使用变量的值,再加 1(或减 1)

例 7:int a = 2; printf("%d\n", a++); printf("%d\n", a); 输出结果
输出结果:2 和 3
例 8:int a = 017; printf("%d\n", a++); 输出结果

先进行进制转换(017 = 15),输出 15,之后 a 变为 16

输出结果:15
例 9:int a = 2, b = 3; b += a++; printf("%d\n", a+b); 输出结果

b += 2 得 5(a++ 先用后加,a 变为 3)

输出结果:8
例 10:int a = -11; printf("%d\n", a+++3); 输出结果

a++ 的值为 -11,-11+3 = -8(之后 a 变为 -10)

输出结果:-8
考试易错点:加加、减减在后的用法。很多同学使用完变量的值后,忘记了将变量的值加 1(或减 1),导致后面的计算错误。

需要区分"在前/在后"的 4 种情况:① 用 printf 函数输出时;② 和其他运算符混合运算时(单独的加加或减减不区分);③ 用于判断条件时;④ 作为函数实参时。

八逗号运算

对应讲义正文第 32-33 页
项目内容
运算符,
优先级最低
结合性自左向右
形式表达式 1, 表达式 2, …, 表达式 n
用法自左向右依次计算每一个表达式,将最后一个表达式的值作为整个逗号表达式的值
例 1:printf("%d\n", (1,2,3)); 的运行结果
输出结果:3
例 2:表达式 (a=3, a+2, a*=2) 的值(int a;)

a=3 → a+2=5(a 不变)→ a*=2 得 a=6,取最后一项

答案:6
例 3:c = a, b*2; 与 例 4:c = (a, b*2); 的区别(int a=2,b=3,c;)

例 3:赋值优先于逗号,c = a = 2;例 4:c = 逗号表达式的值 = b*2 = 6。

答案:例 3 输出 2,例 4 输出 6 —— 逗号运算符的优先级低于赋值运算符。
例 5-8:int a; 求下列表达式的值

例 5:(a=2, a++, a*2) → a=2→3,a*2=6,值为 6

例 6:(a=2, ++a, a*2) → a=3,a*2=6,值为 6

例 7:(a=2, a*2, ++a) → 最后一项 ++a 得 3,值为 3

例 8:(a=2, a*2, a++) → a++ 的值为 4(之后 a=5),值为 4

例 9:表达式 (a=2, b=a++, a+b) 的值(int a, b;)

a=2 → b=a++ 得 b=2(a 变 3)→ a+b=5

答案:5

九强制类型转换

对应讲义正文第 33-34 页
项目内容
形式(类型名)变量 或 (类型名)表达式
单目、双目、三目?单目运算符
优先级正数第二
结合性自右向左
注意:强制类型转换不能更改变量的值。
例 1:float a = 3.75; int b = (int)a; 输出 b、a
float a = 3.75;
int b;
b = (int)a;    // 注意 a 的值没有改变
printf("%d,%f\n", b, a);
输出结果:3,3.750000
例 2:float x=1.5, y=2.0; 表达式 (int)x*y 的值

(int)x = (int)1.5 = 1,1*y = 1*2.0 = 2.0

答案:2.0
例 3:int a=2, b=3; float x=3.5, y=2.5; 表达式 (float)(a+b)/2 + (int)x%(int)y 的值

(float)5/2 = 2.5;(int)3 % (int)2 = 1;2.5+1

答案:3.5

十本章习题(讲义 P34-42)

选择题 54 题 · 点击选项自动判分,做对变绿、做错变红并显示正确答案

十一习题册第二章题库

选自《C语言程序设计习题册》第二章:选择题 56 + 填空题 11 + 读程序写结果 5
已作答 0 / 0 答对 0 正确率 --

补天软考点补充(讲义外高频考点)

根据天津软件学院专升本 C 语言历年考情整理
高频考点 1 · 各类型字节数与范围

VC 环境下:char 1 字节(-128~127)、short 2 字节、int 4 字节、long 4 字节、float 4 字节、double 8 字节。TC 环境下 int 占 2 字节,范围 -32768~32767,unsigned int 0~65535。考题通常注明"假设 int 占 2 个字节",按题意作答。

高频考点 2 · 常量合法性判断(必考)
  • 整型:八进制前导 0 不能出现 8、9(018 非法);十六进制前导 0x 只能 0~9/a~f(0xcdg 非法);C 语言没有二进制常量。
  • 实型:指数形式 e/E 两边必须有数字且右边为整数(1.5e、2e4.5、e3 均非法);62. 带"+"号(+1e+1)合法。
  • 字符:单引号内只能 1 个字符或转义;'\018' 非法(8 不是八进制数字);'\0x2e' 非法(应为 '\x2e');'\x111' 非法(最多 2 位十六进制)。
  • 字符串:双引号括起,空串 "" 合法;存储字节数 = 字符数 + 1(\0);strlen 不算 \0,sizeof 算 \0。
高频考点 3 · / 与 % 的规则

整数相除舍去小数(5/2=2);只要有一边是实型结果就是实型(5/2.0=2.5)。% 两边必须都是整型,结果的符号与左边操作数一致(-5%3=-2,6%-5=1)。取位公式:个位 n%10、十位 n/10%10、百位 n/100%10、千位 n/1000。

高频考点 4 · ++/-- 易错点

在前先加后用,在后先用后加;单独使用(如 a++;)不区分前后。运算对象必须是变量:(a+2)++、5++、(a+b)++ 均非法。混合运算先搞清取值时机:a+++3 等价于 (a++)+3。

高频考点 5 · 逗号与赋值的优先级

逗号运算符优先级最低,赋值仅高于逗号。所以 c = a, b*2; 等价于 (c=a), (b*2),c 得到的是 a;而 c = (a, b*2) 才取逗号表达式的值。逗号表达式取最后一项的值,但每一项都会依次计算(自增自减会生效)。

高频考点 6 · 类型转换与输出

强制类型转换(int)a 不改变 a 本身的值;赋值时实型赋给整型舍去小数(不是四舍五入)。常用格式控制符:%d 十进制、%ld 长整型、%u 无符号、%o 八进制、%x/%X 十六进制、%f/%lf 实型(默认 6 位小数)、%e 指数、%c 字符。八进制、十六进制定义有前导、输出无前导。

高频考点 7 · 易混概念辨析
  • 字符变量本质是整型变量:'a'-32='A','d'-'a'=3,'6'-'0'=6。
  • '\0'(值为 0)≠ '0'(ASCII 48)≠ 0(整数)。
  • 复合赋值 a -= 2+b 等价于 a = a-(2+b),右边整体先算。
  • a+=a-=a*a 类链式自右向左依次算,每一步都更新 a。
  • 只有赋值运算和 ++/-- 能改变变量的值;x+1; 这样的语句合法但不改变 x。
备考建议

第二章在天软 C 语言考试中以选择题、读程序写结果为主,是全卷分值最高的章节之一(约 15-20 分)。重点掌握:① 常量合法性判断(必考 2-3 题);② / 与 % 的混合运算(必考);③ ++ 在前在后的取值时机(必考);④ 逗号表达式与赋值优先级;⑤ 复合赋值链式计算;⑥ sizeof 与 strlen 的区别。本章 110 道题库题目建议做到 100% 正确。