1、1C 语 言 经 典 习 题 及 其 答 案 详 解第 二 章 基 本 数 据 类 型 和 表 达 式2.1 单 项 选 择 题1.下 列 字 符 列 中 , 可 以 作 为 “字 符 串 常 量 ”的 是( ) ABC “ABC“ abc a 解 C 程 序中 , 一 个 字 符 率 常 量 是 表 示 一 个 字 符 序 列 , 书 写时 , 用 双 引 号 字 符 前 后 括 住 这 个 字 符 序 列 。 所 以 只有 “ABC”是 一 个 正 确 的 字 符 率 常 量 , 其 余 都 不 是 。其 中 , ABC 可 作 为 标 识 符 , 字 符 列 abc不 能 出 现 在C
2、程 序 中 , a是 一 个 字 符 常 量 。 所 以 解 答 是 。2.在 以 字 节 存 储 字 符 的 系 统 中 , n 在 内 存 占 用的 字 节 数 是 ( ) 1 2 3 4 解 一 般 来 说 , 一 个 字 符 在 内 存 中 只 占 1 个 字节 , n是 转 义 字 符 , 其 意 义 是 换 行 符 , 它 作 为 一 个字 符 存 储 , 在 内 存 也 只 占 1 个 字 节 。 所 以 解 答 是 。3.字 符 串 “xyz”在 内 存 占 用 的 字 节 数 是 ( ) 3 4 6 8 解 字 符 串 中 的 每 个 字 符 占 1 个 字 节 , 但 C程
3、 序 在 存 储 字 符 串 时 , 要 在 后 一 个 有 效 字 符 后 面 接上 1 个 字 符 串 结 束 的 标 记 符 0。 这 样 , 存 储 字 符串 常 量 “xyz”需 要 4 个 字 节 。 所 以 解 答 是 。 4.在以 下 字 符 列 中 , 合 法 的 长 整 型 常 数 是 ( ) 0L 4962710 0.054838743 2.1869el0 解 为 表 示 不 同 范 围 的 整 数 , 整 型 数 据 分 短 整型 、 基 本 型 和 长 整 型 , 并 对 三 种 整 型 内 部 表 示 的高 位 的 不 同 理 解 , 又 分 别 分 成 无 符 号
4、 和 带 符 号 两种 。 若 要 明 确 指 明 一 个 整 数 是 长 整 型 的 , 必 须 在整 数 之 后 接 上 字 符 L。 所 以 0L 是 一 个 长 整 型 的整 型 常 量 , 而 4962710 是 基 本 整 型 数 据 , 而 对 于用 2 个 字 节 表 示 一 个 基 本 整 型 数 据 的 系 统 来 说 ,该 整 数 将 因 超 出 范 围 而 是 一 个 错 误 的 整 数 ;0.054839743 和 2.1869el0 都 是 double 型 的 实 数 。所 以 解 答 是 。5.一 个 char 型 数 据 , 它 的 值 在 内 存 中 存 放
5、 的 是( ) ASCll 代 码 值 BCD 代 码 值 内 码 值 十 进制 代 码 值 解 计 算 机 存 储 字 符 , 通 常 是 存 储 字 符 的 某 种代 码 值 。 有 许 多 种 字 符 编 码 的 方 法 , 流 行 的 是ASCII 代 码 。 在 C 语 言 中 , Char 型 数 据 也 用ASCII 代 码 表 示 。 所 以 解 答 是 。6.设 变 量 m, n, a, b, c, d 的 初 值 均 为 0, 执 行( m a b) |( n c d) 后 , m, n 的 值 是( ) 0, 0 0, 1 l, 0 1, 1 解 计 算 ( ma b)
6、|( n=c=d) 的 过 程 是 先 计 算 逻 辑 或 的 左 运算 分 量 ( m=a=b) 的 值 , 由 于 赋 位 运 算 符 的 优 先 级比 关 系 运 算 符 =的 优 先 级 低 , 又 先 计 算 a=b.因 a,b 均 为 0 后 , 所 以 比 较 结 果 值 为 1.将 1 赋 给 变 量m, 使 变 量 m 的 值 变 为 1. 同 时 这 个 赋 值 运 算 的 结果 也 是 1, 这 样 逻 辑 运 算 的 左 运 算 分 量 的 值 为 1.由于 逻 辑 或 运 算 的 左 运 算 分 量 值 为 1, 按 照 C 语 言 对逻 辑 或 运 算 优 化 计
7、算 的 规 定 , 不 再 计 算 逻 辑 或 的 右运 算 分 量 , 而 直 接 得 到 逻 辑 或 运 算 的 结 果 为 1.由 于逻 辑 或 的 右 运 算 分 量 不 曾 计 算 过 , 所 以 变 量 n 的 值也 不 为 变 化 。 这 样 , 上 述 表 达 式 计 算 后 , 变 量 m 的情 为 1, 变 量 n 的 值 为 0.所 以 解 答 是 。7.设 a 为 5, 执 行 下 列 计 算 后 , b 的 值 不 为 2 的是 ( ) b a 2 b 6-( -a) b a 2 b a3? 3: 2 解 因 两 个 整 型 数 据 相 除 , 结 果 是 整 数 ,
8、 当 a的 值 为 5 时 , 计 算 表 达 式 b=a 2 后 , 使 b 的 值 为2.计 算 表 达 式 b 6-( -a) 是 先 计 算 子 表 达 式 ( -a) 的 , 先 让 a 的 值 减 1 变 成 4, 并 以 减 1 后 的 a为 子 表 达 式 的 结 果 , 所 以 子 表 达 式 的 结 果 为 4, 后使 b 的 值 为 2.在 计 算 表 达 式 b=a%2 时 , 求 余 运 算a 2 的 结 果 为 1, 后 使 变 量 b 的 值 为 1.计 算 表 达2式 b a 3? 3: 2 时 , 先 计 算 条 件 表 达 式 a 3?3: 2, 以 2 为
9、 结 果 , 后 也 使 变 量 b 的 值 为 人 所 以解 答 是 。8.执 行 语 句 “x ( a 3, b a-) ; ”后 , X, a, b的 值 依 次 为 ( ) 3, 3, 2 2, 3, 2 3, 2, 3 2, 3, 3 解 计 算 表 达 式 x ( a=3, b=a-) 时 , 先 计 算赋 值 号 右 端 圆 括 号 内 的 逗 号 表 达 式 。 逗 号 表 达 式 要求 各 子 表 达 式 顺 序 计 算 , 并 以 后 予 表 达 式 的 值 为 整个 逗 号 表 达 式 的 结 果 。 所 以 该 表 达 式 计 算 时 , 先 让变 量 a 的 值 为
10、3, a-的 值 是 a 当 时 的 值 , 以 该 值为 结 果 赋 给 变 量 b, 并 以 该 值 为 逗 号 表 达 式 的 值 赋给 变 量 x, 然 后 a 的 值 被 减 少 1.所 以 计 算 该 表 达式 后 , 使 变 量 x, a, b 的 值 依 次 为 3, 2, 3.所 以解 答 是 。9.设 整 型 变 量 m, n, a, b, c, d 均 为 1, 执 行“( m ab) ( n a b) ”后 m, n 的 值 是( ) 0, 0 0, l 1, 0 1 , l 解 表 达 式 ( m a b) ( n a b) 是一 个 逻 辑 表 达 式 , 它 的
11、计 算 过 程 是 先 计 算 逻 辑 与 的左 分 量 ( m a b, 其 中 又 是 先 计 算 a b.因 a b不 成 立 , 结 果 为 0, 将 0 赋 给 变 量 m, 后 逻 辑 与的 左 分 量 结 果 为 0.由 于 逻 辑 运 算 采 用 特 别 的 优 化 计算 规 则 , 当 逻 辑 与 的 左 分 量 结 果 为 0 时 , 不 再 计 算逻 辑 与 的 右 分 量 , 而 直 接 以 0 为 逻 辑 与 的 结 果 。 所以 , 上 述 表 达 式 计 算 使 m 的 值 变 为 0, 而 n 的 值没 有 变 , 依 旧 为 l.所 以 解 答 是 。 10,
12、 设 有 代 码“inta 3; ”, 则 执 行 了 语 句“a+=a-=a*a; ”后 , 变 量 a 的 值 是 ( ) 3 0 9 -12 解 由 于 赋 值 运 算 符 的 结 合 性 自 右 至 左 , 语 句“a+=a-=a*a; ”的 执 行 是 先 计 算 a*a, 得 到 值 9, 再计 算 a- a*a, 使 a 的 值 为 -6, 接 着 计 算 a+ a, 使a 的 值 为 -12.所 以 解 答 是 。11.在 以 下 一 组 运 算 符 中 , 优 先 级 高 的 运 算 符是 ( ) % 解 常 规 运 算 符 的 优 先 级 自 高 到 低 的 排 列 顺 序
13、是 算 术 运 算 符 、 移 位 运 算 符 、 关 系 运 算 符 。 按 位 运算 符 、 逻 辑 运 算 符 、 条 件 运 算 符 、 赋 值 运 算 符 、 逗号 运 算 符 。 所 以 问 题 所 给 的 四 个 运 算 符 按 优 先 级 自高 到 低 的 排 列 顺 序 是 , , , 。 所 以 解答 是 。14.若 已 定 义 x 和 y 为 double 类 型 , 则 表 达 式 :x l, y x 3 2 结 果 是 ( ) l 2 2.0 2.5 解 由 于 变 量 x 和 y 都 是 double 类 型 , 表 达式 x l, y x 3 2 是 先 计 算
14、x 1, 由 于 1 是 整型 的 , x 是 double 类 型 的 , 该 计 算 先 将 整 数 1 转换 成 double 类 型 的 1.0, 并 将 1.0 赋 给 变 量 x.计算 y x 3 2 是 先 求 3 2 的 值 , 因 是 两 整 数 相除 , 结 果 是 整 型 值 1, 然 后 在 计 算 x 1 时 , 也 先 将1 转 换 成 1.0, 然 后 求 得 x l 的 值 为 2.0, 后 将 该 值赋 给 变 量 y, 并 得 到 整 个 表 达 式 的 值 为 2.0.所 以 解答 是 。15.设 a=1, b=2, c 3, d 4 则 表 达 式 a
15、b?a: c d? a: d 的 结 果 为 ( ) 4 3 2 1 解 条 件 运 算 符 的 优 先 级 比 关 系 运 算 符 的 优 先级 低 , 并 且 它 的 结 合 性 是 自 右 向 左 的 , 所 以 表 达式 a b? a: c d? a: d 可 用 圆 括 号 等 价 地 写 成( a b? a: ( ( c main( ) int c; *变 量 定 义 * printf( “输 入 一 个 整 数 ”) ; scanf( “ d”, c) ; if( c 0) printf( “1n”) ; elseprintf( “-ln”) ;6.编 一 个 程 序 , 输 入
16、 10 个 整 数 , 统 计 并 输 出 其 中正 数 、 负 数 和 零 的 个 数 。 解 输 入 10 个 整 数 , 统 计 其 中 正 数 、 负 数 和零 的 个 数 。 程 序 引 入 3 个 计 数 器 变 量 , 用 于 统 计 大于 以 小 于 0 和 等 于 0 的 整 数 的 个 数 。 开 始 时 , 这3 个 计 数 器 都 置 0, 然 后 用 循 环 逐 一 输 入 10 个 整数 , 并 判 定 当 前 输 入 的 整 数 是 大 于 0, 或 小 于 0,或 等 于 0, 并 按 判 定 结 果 累 加 相 应 计 数 器 。 后 , 程序 输 出 这 3
17、 个 计 数 器 的 值 。 程 序 如 下 :#include printf( “y=%.6fn”, y) ;main( ) int i, d, n, z, p; /*变 量 定 义 */ 9.编 一 个 程序 显 示 ASCII 代 码 0x20 至 ox6f 的 十 n z p 0; 进 制 数 值 及 其 对 应 字 符 。for( i 1; i0) p+;#includeelsez+; main( ) inti, k0; printf( “负 数 有 %d 个 , 正 数 有 %d 个 , 零 有 %dfor( i=0x20; i. 函 数 strlen( ) 是 系 统 提 供 的
18、字 符 串 处 理 函 数 之 一 , 字 符 串 处 理 函 数 的 函 数 原 型说 明 和 它 们 用 到 的 有 关 常 量 、 数 据 结 构 等 , 在 系 统提 供 的 头 文 件 string.h 中 定 义 , 所 以 使 用 该 函 数 的程 序 应 在 程 序 开 头 写 上 包 含 命 令#include.6.以 下 程 序 可 把 输 入 的 十 进 制 数 以 十 六 进 制 数 的形 式 输 出 , 请 填 空 。 main( ) char b17=“0123456789ABCDEF” ;int c64, d, i 0, base 16; long n;print
19、f( “Enter a number: n”) ; scanf( “%ld”, for( i 0; s! 0; i+) if( si=A&si=a& s i=z) s s a A ; printf( “s %sn”,s) ; 第 五 章 指 针5.1 单 项 选 择 题1.设 有 定 义 “int a 3, b, *p &a; ”, 则 下 列 语句 中 使 b 不 为 3 的 语 句 是 ( ) b *&a; b *p; b a; b *a; 解 定 义 有 inta 3, b, *p &a; 对 b 赋 值的 表 达 式 有 *&a、 *p、 a 、 *a. 引 用 变 量 a 的 值 有
20、两 种 方 法 , 一 是 直 接 引 用 a, 二 是 通 过 a 的 指 针间 接 引 用 a. 对 于 后 者 , 又 有 多 种 表 达 方 法 , 通 过指 向 a 的 指 针 p, 间 接 引 用 a 的 内 容 , 如 *p. 或 通过 求 地 址 运 算 符 由 变 量 a 得 到 其 指 针 &a, 再 由 这指 针 表 达 式 间 接 引 用 a 的 内 容 , 如 * &a.所 以 表 达式 *&a、 *p 和 a 都 能 引 用 变 量 a 的 值 , 而 使 b的 值 为 3. 而 表 达 式 b=*a 是 错 误 的 , 因 为 a 不 是指 针 变 量 , 不 能
21、 对 它 施 行 取 内 容 运 算 符 所 以解 答 是 。123.若 有 说 明 : “int i, j 7, *p &i; ”, 则 与“i j; ”等 价 的 语 句 是 ( ) i *p; *p *&j; i=&j; i *p; 解 指 针 变 量 p 指 向 变 量 i 时 , 表 达 式 i=*p等 价 于 i i; 表 达 式 *p *&j 等 价 于 i j; 而 表 达式 i &j 企 图 将 整 型 变 量 的 指 针 赋 给 整 型 变 量 , 这是 错 误 的 ; 表 达 式 i=*p 也 是 一 种 错 误 的 表 达 式 。p 是 指 针 , *p 是 p 所 指
22、 变 量 j, *p 是 企 图 将 整 型变 量 j 当 作 指 针 , 并 想 通 过 j 间 接 引 用 某 个 变 量 。所 以 解 答 是 。4.若 有 说 明 语 句 “inta10, *p a; ”, 对 数 组元 素 的 正 确 引 用 是 ( ) ap pa *(p+2) p 2 解 在 C 语 言 中 , 约 定 数 组 名 单 独 出 现 在 表 达式 中 时 , 它 表 示 数 组 首 元 素 的 指 针 。 有 inta10 ,则 a 可 以 作 为 &a0使 用 。 另 有 整 型 指 针 变 量 p,代 码 p a 实 现 p 指 向 数 组 a 的 首 元 素
23、。 则 表 达 式*( p 2) 是 引 用 数 组 元 素 a2.表 达 式 ap和 pa都是 不 正 确 的 , 下 标 必 须 是 整 型 表 达 式 , 不 可 以 是指 针 表 达 式 。 表 达 式 p 2 是 指 针 表 达 式 , 它 的 值是 &p2. 所 以 只 有 表 达 式 *( p 2) 引 用 数 组 a 的元 素 a2. 所 以 解 答 是 。5.下 面 各 语 句 中 , 能 正 确 进 行 赋 字 符 串 操 作 的 语句 是 ( ) char s5 =“ABCDE”; char s5 =A,B, C, D, E; char *s; s “ABCDE”; ch
24、ar *s; scanf( “%s”,&s) ; 解 字 符 串 终 存 储 于 字 符 数 组 中 , 存 储 字 符串 的 字 符 数 组 可 以 是 程 序 主 动 引 入 的 ( 定 义 或动 态 分 配 ) , 也 可 以 是 字 符 串 常 量 , 由 系 统 分配 。 其 中 字 符 数 组 用 字 符 串 初 始 化 就 是 字 符 串存 储 于 由 程 序 引 入 的 字 符 数 组 的 例 子 。 给 字 符指 针 赋 字 符 串 则 是 系 统 自 动 分 配 字 符 串 存 储 空间 的 例 子 。 给 字 符 指 针 赋 字 符 串 并 不 是 将 一 个长 长 的
25、字 符 串 存 于 字 符 指 针 变 量 中 , 而 是 将 字符 串 常 量 存 储 于 常 量 区 , 并 将 存 储 这 个 字 符 串的 首 字 节 地 址 赋 给 指 针 变 量 , 让 指 针 变 量 指 向字 符 串 常 量 的 首 字 符 。 对 于 以 字 符 串 作 为 字 符数 组 初 值 的 情 况 , 要 求 字 符 数 组 足 够 的 大 , 能存 得 下 字 符 串 常 量 。 这 里 有 一 个 特 别 的 规 定 ,若 数 组 的 大 小 少 于 存 储 字 符 串 有 效 字 符 的 字 节个 数 , 系 统 将 报 告 错 误 ; 当 字 符 数 组 的
26、 大 小 只能 存 储 字 符 串 的 有 效 字 符 , 而 不 能 存 储 字 符 率结 束 标 记 符 时 , 则 存 储 于 字 符 数 组 中 的 内 容 是字 符 序 列 , 因 没 有 存 储 字 符 串 结 束 标 记 符 , 存储 的 内 容 就 不 是 字 符串 。 如 代 码 chara5 “ABCDE”。另 外 , 给 字 符 数 组 元 素 逐 一 赋 字 符 初 值 , 并 在字 符 初 值 中 没 有 字 符 串 结 束 标 记 符 , 则 存 于 字 符 数组 中 的 内 容 也 不 是 字 符 串 。 如 代 码 chars5=A,B, C, D, E. 特
27、别 要 注 意 当 字 符 指 针 还 未 指向 某 个 字 符 数 组 的 元 素 时 , 不 可 以 通 过 字 符 指 针 输入 字 符 串 。 如 代 码 char *s; scanf( “%s”, s) 。 若写 成 char *str; scanf( “%s”, &str) 更 是 错 误 的了 。由 于 C 语 言 规 定 数 组 不 能 相 互 赋 值 , 所 以 只 能 将 字符 串 常 量 赋 给 某 字 符 指 针 。 如 代 码 char*s; s“ABCDE”是 正 确 的 。 实 际 上 , 字 符 串 “ABCDE” 被存 储 于 常 量 区 中 , 向 指 针
28、变 量 赋 的 是 字 符 指 针 ,让 s 指 向 其 中 的 字 符 A。 所 以 解 答 是 。7.若 有 以 下 定 义 , 则 值 为 3 的 表 达 式 是 ( )inta 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,*p a; p 2, *( p+) p 2, * +p p 3, *p+ p 2, +*p 解 数 组 a 有 10 个 元 素 , 分 别 有 值 1 至10, 指 针 变 量 p 指 向 a0 逗 号 表 达 式 p 2, *( p+) , 先 是 p 2 使 p 指 向 a2, 接 着 是 *( p+) , 以 当 时 P 所 指 变 量 a2取
29、 内 容 3 为 表 达式 的 值 , 同 时 使 p 指 向 a3. 逗 号 表 达 式 p 2, * +p, 先 是 p 2 使 p 指 向 a2, 以 后 是 *+p, 又 使 p 增 1, 让 它 指 向 a3, 并 取 指 针 p 所指 变 量 a3的 内 容 4 作 为 表 达 式 的 值 。 逗 号 表 达式 p 3, *p+, 先 是 p+=3 使 p 指 向 a3, 以后 是 *p+, 表 达 式 的 值 是 a3为 4, 而 使 p 指 向a4. 逗 号 表 达 式 p 2, +*p, 先 是 p 2,使 p 指 向 a2, 以 后 是13+*p, 因 当 时 的 *p 就
30、 是 a2, +a2使 a2增 1,变 成 4, 并 以 4 为 表 达 式 的 值 。 所 以 只 有 p 2, *( p+) 的 值 是 3.所 以 解 答 是 。8.设 有 定 义 “chara10=”abcd“, *p=a; ”, 则*( p 4) 的 值 是 ( ) “abcd” d 0 不 能 确 定 解 若 有 chara10 “abcd”, *p a, 则 指 针变 量 p 指 向 a0. 在 表 达 式 *( p 4) 中 , p 4 指向 a4, *( p 4) 就 是 a4.由 于 用 字 符 串 “abcd”给 字 符 数 组 a 赋 初 值 , a4的 值 是 字 符
31、 串 结 束 标 记符 0。 所 以 解 答 是 。12.若 有 如 下 定 义 和 语 句 , 则 输 出 结 果 是 ( )int *pp, *p, a 10, b 20; pp=&p; p&a; p &b; printf( “%d%dn”,*p, *pp) ; 10, 20 10, 10 20, 10 20, 20 解 上 述 代 码 定 义 变 量 pp 是 指 针 的 指 针 , 它能 指 向 一 个 指 向 整 型 变 量 的 指 针 。 定 义 变 量 p 是 指针 , 它 能 指 向 一 个 整 型 变 量 。 a 是 一 个 整 型 变 量 ,它 有 初 值 10.b 也 是
32、 一 个 整 型 变 量 , 它 有 初 值 20.代码 pp=&p 使 pp 指 向 p, p &a 使 p 指 向 a, p&b 又 使 p 指 向 b, 不 再 指 向 a. 所 以 *p 是 引 用b, 其 值 为 20. *pp 是 通 过 pp 间 接 引 用 p, 再 通过 p 间 接 引 用 b, 所 以 也 是 20. 所 以 解 答 是 。13.若 有 以 下 定 义 和 语 句 , 则 对 w 数 组 元 素 的 非 法引 用 是 ( )int w23, ( * pw) 3; pw w; *( w0 2) *pw2 pw00 *(pwl+2) 解 上 述 代 码 定 义
33、2 行 3 列 的 二 维 数 组 w,定 义 能 指 向 有 3 个 整 型 元 素 一 维 数 组 的 指 针 pw,并 让 pw 指 向 数 组 w 的 第 一 行 。 代 码 *( w02) 中 的 w0是 &w00, w0 2 是 &w02, 所以 * ( w0 2) 就 是 w02. 代 码 *pw2中 的pw2 是 &w20, 该 数 组 w 只 有 2 行 , 没 有w20, 所 以 代 码 *pw2是 对 数 组 W 元 素 的 非 法引 用 。 代 码 pw00就 是 w00. 代 码 *( pwl 2) 中 的 pw1 就 是 *( pw l) , 即 &wl0,pwl 2 就 是 &wl2, 所 以 *( pw1 2) 就 是w12. 所 以 解 答 是 。