一变量和常量
- 变量:用于保存数据,在程序运行过程中变量的值可以改变,系统会为该变量分配内存空间。
- 常量:在程序运行过程中,常量的值无法修改。
例 1:int a = 2; 的含义
定义一个 int 型(整型)变量 a,并且给它赋一个初值 2。
例 2:int a; 未被赋值,变量里面是什么?
例 3:执行 int a = 5; a = 3; 后,a 的值为?
例 4:执行 int a = 3; a = a+2; 后,a 的值为?
例:
int a=2, b=3; printf("%d,%d\n", a, b); 输出 2,3二整型
在 C 语言中,简单数据类型包括整型、实型、字符型。整型即整数,在 C 语言中,十进制整型采用补码的形式表示。
1. 整型常量
C 语言能表示的进制数包括十进制(默认)、八进制和十六进制,注意 C 语言不能表示二进制数。
| 进制 | 表示方法 | 格式控制符 | 示例 |
|---|---|---|---|
| 十进制(默认) | 直接书写 | %d | int a = 23; |
| 八进制 | 前导 0(数字零) | %o | int a = 023; |
| 十六进制 | 前导 0x 或 0X | %x / %X | int a = 0x5ab; |
例 4:printf("%d,%d\n", 023, 0x23); 的输出结果
023 = 2×8+3 = 19;0x23 = 2×16+3 = 35
例 5:printf("%o,%x\n", 50, 50); 的输出结果
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
例 4:int a = 32767; a = a+1; 输出结果(溢出)
a 已是 int 型(2 字节)能表示的最大值,再加 1 不会得到 32768,而是 -32768,这样的情况叫做"溢出"。
3. 无符号数(unsigned)
定义无符号数的关键字是 unsigned。假设 int 占 2 个字节,unsigned int 型能表示整数的范围为 0 ~ 65535,不能表示负数。无符号输出格式控制符为 %u。
① 整数 -1 以 %u 形式输出得 65535;
② 无符号数 65535 以 %d 输出得 -1。
例 8:unsigned int a = 65535; a = a+1; printf("%u\n", a); 的输出结果
三实型
1. 实型常量
实型常量包括小数形式和指数形式。
- 小数形式:必须要有小数点。".5" 等价于 "0.5","5." 也是合法实型。
- 指数形式:由 e 或 E 加数字组成,e 或 E 的两边必须有数字;e 或 E 的右边必须是整数(可以加 +、- 号),不能是小数。
例 4:合法的实型常量是( )A. 05 B. 1.5e C. .3E-2 D. 3.5E2.5
A 是八进制整型;B 的 e 右边无数字;D 的 e 右边是小数。
例 5:合法的常量是( )A. 2,000 B. 018 C. .5 D. 2e-3.0
A 不能有逗号;B 八进制不能出现 8;D 的 e 右边是小数。
例 6:合法的常量是( )A. e5 B. 0xE2 C. 3.e D. 0.3e5.0
A 的 e 左边无数字;C 的 e 右边无数字;D 的 e 右边是小数。
2. 实型变量
| 关键字 | 类型 | 字节数 | 格式控制符 |
|---|---|---|---|
| float | 单精度浮点 | 4 | %f |
| double | 双精度浮点 | 8 | %lf |
例 1:float a = 12.345; printf("a=%f\n", a); 的输出结果
例 2:%e 以指数形式输出
float a=31.415926, b=123.4, c=0.0567; 用 %e 输出:
四字符型
西文字符在计算机中以 ASCII 码的形式存储,存储一个字符占用一个字节。
| 字符 | 0~9 | A~Z | a~z |
|---|---|---|---|
| ASCII 码(十进制) | 48~57 | 65~90 | 97~122 |
1. 字符常量
- 'A'、'5'、'"'、' '(空格)都是合法的字符常量,'ab' 是不合法的字符常量。
- ASCII 码值也是整数,可以用 %d 输出:printf("%d\n", 'A'); 输出 65。
- 格式控制符 %c 表示字符原型;字符常量以原型输出时无单引号。
- 注意整数 2 和字符 '2' 的不同:2 与 50。
2. 转义字符常量
转义字符常量的特点是以 "\" 开头。'n' 是普通字符常量,'\n' 是转义字符常量,其作用是换行。
| 转义字符 | 功能 | 转义字符 | 功能 |
|---|---|---|---|
| \n | 换行 | \\ | 表示反斜杠 \ |
| \t | 跳格(跳到下一个制表位) | \' | 表示单引号 ' |
| \b | 退格 | \" | 表示双引号 " |
| \ddd | 1 到 3 位八进制 ASCII 码表示的一个字符 | \xhh | 1 到 2 位十六进制 ASCII 码表示的一个字符 |
例 3:printf("%c,%c\n", '\101', '\x42'); 的输出结果
'\101' 八进制 101 = 65 = 'A';'\x42' 十六进制 42 = 66 = 'B'
例 4:printf("%d,%d\n", '\0', '0'); 的输出结果
注意二者的不同之处:'\0' 是转义字符(值为 0),'0' 是数字字符(ASCII 为 48)。
例 6:合法的字符常量为( )A. "a" B. 'xh' C. '\\' D. '\72'
A 是字符串;B 引号内有两个字符;D '\72' 中 7、2 是八进制数字,实为合法?——注意本题 D 写作 '\72' 为 1~3 位八进制转义,合法;但按讲义答案取 C(反斜杠的转义)。
例 7:合法的字符常量为( )A. '\108' B. '\67' C. '\0' D. '2+3'
A 中 8 不是八进制数字;C '\0' 合法但题目取值为 B?——'\67' 是合法的八进制转义(1~3 位)。
例 8:不合法的字符常量为( )A. '"' B. '\n' C. '\0x2e' D. '?'
'\0x2e' 中 \0 后不能再跟 x,十六进制转义应写作 '\x2e'。
3. 字符串常量
- "xyj"、"0516"、"ab\nc\\"、""(空串)都是合法的字符串常量,'abcd' 不是合法的字符串常量。
- 字符串常量 "ABCD" 存储时:A、B、C、D 后跟转义字符 '\0'(字符串结束标志),也占一个字节,共需 5 个字节。
- 【sizeof】求数据或数据类型所占的字节数。
- 【strlen】库函数,求字符串的长度(需 #include <string.h>)。
例 3:int len = sizeof("ABCD"); 输出结果
例 4:int len = strlen("ABCD"); 输出结果
例 5:以下字符串存储时所占的字节数
1) "Ab\\110\n" 2) "\\123\t\xffa" 3) "123,\4\"" 4) "\x41\n56"
4. 字符变量
关键字 char,占 1 个字节,表示的范围为 -128~127。char 型变量本质也是整型变量,因为 ASCII 码本身就是整数。
char ch1 = 'A'; // 用字符常量给字符变量赋值 char ch2 = 66; // 用字符的 ASCII 码给字符变量赋值 printf("%c,%c\n", ch1, ch2); // 输出 A,B
② 字符变量在做运算时本质是用其 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);
五算术运算
| 项目 | 内容 |
|---|---|
| 运算符 | +、-、*、/(除法)、%(求余) |
| 单目、双目、三目? | 双目运算符 |
| 优先级 | *、/、% 高于 + 和 - |
| 结合性 | 自左向右 |
1. 除法运算符 /
例:写出下列表达式的运算结果
① 5/2 ② 10/3 ③ 2/3 ④ 3/2.0 ⑤ 3.0/2 ⑥ 6.0/2
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
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);
例 5:数学式对应的 C 语言表达式
① b²-4ac → b*b-4*a*c
② a/(bc) → a/(b*c) 或 a/b/c
六赋值运算
| 项目 | 内容 |
|---|---|
| 运算符 | =、+=、-=、*=、/=、%= |
| 单目、双目、三目? | 双目运算符 |
| 优先级 | 倒数第二,仅高于逗号运算符 |
| 结合性 | 自右向左 |
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 时舍去小数部分
例 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);
例 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);
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
例 3:int a; a += (a=5); 输出结果
a 先被赋值 5,再 a+=5
例 4:int a = 3; a += a -= a*a; 输出结果
自右向左:a -= 9 得 a=-6;a += (-6) 得 -12
七加加、减减运算
| 项目 | 内容 |
|---|---|
| 运算符 | ++、-- |
| 单目、双目、三目? | 单目运算符 |
| 优先级 | 正数第二 |
| 结合性 | 自右向左 |
| 作用 | 使变量的值加 1(或减 1) |
在前的用法:先加 1(或减 1),再使用变量的值
例 4:int a = 2; printf("%d\n", ++a); 输出结果
例 5:int a = 017; printf("%d\n", ++a); 输出结果
先进行进制转换(017 八进制 = 15),再处理加加
例 6:int a = 2, b; b = ++a; 输出 a、b
在后的用法:先使用变量的值,再加 1(或减 1)
例 7:int a = 2; printf("%d\n", a++); printf("%d\n", a); 输出结果
例 8:int a = 017; printf("%d\n", a++); 输出结果
先进行进制转换(017 = 15),输出 15,之后 a 变为 16
例 9:int a = 2, b = 3; b += a++; printf("%d\n", a+b); 输出结果
b += 2 得 5(a++ 先用后加,a 变为 3)
例 10:int a = -11; printf("%d\n", a+++3); 输出结果
a++ 的值为 -11,-11+3 = -8(之后 a 变为 -10)
需要区分"在前/在后"的 4 种情况:① 用 printf 函数输出时;② 和其他运算符混合运算时(单独的加加或减减不区分);③ 用于判断条件时;④ 作为函数实参时。
八逗号运算
| 项目 | 内容 |
|---|---|
| 运算符 | , |
| 优先级 | 最低 |
| 结合性 | 自左向右 |
| 形式 | 表达式 1, 表达式 2, …, 表达式 n |
| 用法 | 自左向右依次计算每一个表达式,将最后一个表达式的值作为整个逗号表达式的值 |
例 1:printf("%d\n", (1,2,3)); 的运行结果
例 2:表达式 (a=3, a+2, a*=2) 的值(int a;)
a=3 → a+2=5(a 不变)→ a*=2 得 a=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。
例 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
九强制类型转换
| 项目 | 内容 |
|---|---|
| 形式 | (类型名)变量 或 (类型名)表达式 |
| 单目、双目、三目? | 单目运算符 |
| 优先级 | 正数第二 |
| 结合性 | 自右向左 |
例 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);
例 2:float x=1.5, y=2.0; 表达式 (int)x*y 的值
(int)x = (int)1.5 = 1,1*y = 1*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
十本章习题(讲义 P34-42)
十一习题册第二章题库
补天软考点补充(讲义外高频考点)
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 个字节",按题意作答。
- 整型:八进制前导 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。
整数相除舍去小数(5/2=2);只要有一边是实型结果就是实型(5/2.0=2.5)。% 两边必须都是整型,结果的符号与左边操作数一致(-5%3=-2,6%-5=1)。取位公式:个位 n%10、十位 n/10%10、百位 n/100%10、千位 n/1000。
在前先加后用,在后先用后加;单独使用(如 a++;)不区分前后。运算对象必须是变量:(a+2)++、5++、(a+b)++ 均非法。混合运算先搞清取值时机:a+++3 等价于 (a++)+3。
逗号运算符优先级最低,赋值仅高于逗号。所以 c = a, b*2; 等价于 (c=a), (b*2),c 得到的是 a;而 c = (a, b*2) 才取逗号表达式的值。逗号表达式取最后一项的值,但每一项都会依次计算(自增自减会生效)。
强制类型转换(int)a 不改变 a 本身的值;赋值时实型赋给整型舍去小数(不是四舍五入)。常用格式控制符:%d 十进制、%ld 长整型、%u 无符号、%o 八进制、%x/%X 十六进制、%f/%lf 实型(默认 6 位小数)、%e 指数、%c 字符。八进制、十六进制定义有前导、输出无前导。
- 字符变量本质是整型变量:'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% 正确。