C_C笔试题汇总.pdf
《C_C笔试题汇总.pdf》由会员分享,可在线阅读,更多相关《C_C笔试题汇总.pdf(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、最 近 因 为 找 工 作,收 集 了 很 多 C 语 言 方 面 方 面 的 面 试 题 以 及 答 案。现 在 新 工 作 搞 定 了,决 定 把 这 些 资 料 发 出 来,送 给 有 需 要 的 朋 友,免 得 再 象 我 一 样 到 处 搜 寻,实 在 辛 苦。发 布 之 前 先 申 明 两 点:1 所 有 资 料 来 自 网 络(主 要 是 C S D N),本 人 只 是 收 集 和 转 发。2 所 有 问 题 解 答(尤 其 是 代 码)只 是 参 考,不 保 证 正 确。先 发 基 本 问 题,再 发 编 程 问 题.想 成 为 嵌 入 式 程 序 员 应 知 道 的 0 x
2、10个 基 本 问 题:预 处 理 器(Preprocessor)1.用 预 处 理 指 令#define声 明 一 个 常 数,用 以 表 明 1年 中 有 多 少 秒(忽 略 闰 年 问 题)#define SECONDS_PER_YEAR(60*60*24*365)UL我 在 这 想 看 到 儿 件 事 情:1)#define语 法 的 基 本 知 识(例 如:不 能 以 分 号 结 束,括 号 的 使 用,等 等)2)懂 得 预 处 理 器 将 为 你 计 算 常 数 表 达 式 的 值,因 此,直 接 写 出 你 是 如 何 计 算 一 年 中 有 多 少 秒 而 不 是 计 算 出
3、 实 际 的 值,是 更 清 晰 而 没 有 代 价 的。3)意 识 到 这 个 表 达 式 将 使 一 个 16位 机 的 整 型 数 溢 出-因 此 要 用 到 长 整 型 符 号 L,告 诉 编 译 器 这 个 常 数 是 的 长 整 型 数。4)如 果 你 在 你 的 表 达 式 中 用 到 UL(表 示 无 符 号 长 整 型),那 么 你 有 了 一 个 好 的 起 点。记 住,第 一 印 象 很 重 要。2.写 一 个 标 准 宏 MIN,这 个 宏 输 入 两 个 参 数 并 返 回 较 小 的 一 个。#define MIN(A,B)(A)=(B)?(A):(B)这 个 测
4、试 是 为 卜 面 的 目 的 而 设 的:1)标 识#define在 宏 中 应 用 的 基 本 知 识。这 是 很 重 要 的。因 为 在 嵌 入(inline)操 作 符 变 为 标 准 C 的 一 部 分 之 前,宏 是 方 便 产 生 嵌 入 代 码 的 唯 一 方 法,对 于 嵌 入 式 系 统 来 说,为 了 能 达 到 要 求 的 性 能,嵌 入 代 码 经 常 是 必 须 的 方 法。2)三 重 条 件 操 作 符 的 知 识。这 个 操 作 符 存 在 C 语 言 中 的 原 因 是 它 使 得 编 译 器 能 产 生 比 if-then-else更 优 化 的 代 码,了
5、 解 这 个 用 法 是 很 重 要 的。3)懂 得 在 宏 中 小 心 地 把 参 数 用 括 号 括 起 来 4)我 也 用 这 个 问 题 开 始 讨 论 宏 的 副 作 用,例 如:当 你 写 下 面 的 代 码 时 会 发 生 什 么 事?least=MIN(*p+,b);3.预 处 理 器 标 识#error的 目 的 是 什 么?如 果 你 不 知 道 答 案,请 看 参 考 文 献 1。这 问 题 对 区 分 一 个 正 常 的 伙 计 和 一 个 书 呆 子 是 很 有 用 的。只 有 书 呆 子 才 会 读 C 语 言 课 本 的 附 录 去 找 出 象 这 种 问 题 的
6、 答 案。当 然 如 果 你 不 是 在 找 一 个 书 呆 子,那 么 应 试 者 最 好 希 望 自 己 不 要 知 道 答 案。死 循 环(Infinite loops)4.嵌 入 式 系 统 中 经 常 要 用 到 无 限 循 环,你 怎 么 样 用 C 编 写 死 循 环 呢?这 个 问 题 用 几 个 解 决 方 案。我 首 选 的 方 案 是:while(1)()一 些 程 序 员 更 喜 欢 如 下 方 案:for(;)()这 个 实 现 方 式 让 我 为 难,因 为 这 个 语 法 没 有 确 切 表 达 到 底 怎 么 回 事。如 果 一 个 应 试 者 给 出 这 个
7、作 为 方 案,我 将 用 这 个 作 为 一 个 机 会 去 探 究 他 们 这 样 做 的 基 本 原 理。如 果 他 们 的 基 本 答 案 是:我 被 教 着 这 样 做,但 从 没 有 想 到 过 为 什 么。”这 会 给 我 留 下 个 坏 印 象。第 三 个 方 案 是 用 gotoLoop:goto Loop;应 试 者 如 给 出 上 面 的 方 案,这 说 明 或 者 他 是 一 个 汇 编 语 言 程 序 员(这 也 许 是 好 事)或 者 他 是 一 个 想 进 入 新 领 域 的 BASIC/FORTRAN程 序 员。数 据 声 明(Data declarations
8、)5.用 变 量 a 给 出 下 面 的 定 义 a)一 个 整 型 数(An integer)b)个 指 向 整 型 数 的 指 针(A pointer to an integer)c)个 指 向 指 针 的 的 指 针,它 指 向 的 指 针 是 指 向 个 整 型 数(A pointer to a pointer to an intege)rd)”个 有 10个 整 型 数 的 数 组(An array of 10 integers)e)个 有 10个 指 针 的 数 组,该 指 针 是 指 向 一 个 整 型 数 的。(An array of 10 pointers to intege
9、rs)f)个 指 向 有 10个 整 型 数 数 组 的 指 针(A pointer to an array of 10 integers)g)个 指 向 函 数 的 指 针,该 函 数 有 一 个 整 型 参 数 并 返 回 个 整 型 数(A pointer to a function that takes aninteger as an argument and returns an integer)h)一 个 有 10个 指 针 的 数 组,该 指 针 指 向 一 个 函 数,该 函 数 有 一 个 整 型 参 数 并 返 回 一 个 整 型 数(An arrayof ten poin
10、ters to functions that take an integer argument and return an integer)答 案 是:a)int a;II An integerb)int*a;/A pointer to an integerc)int*a;/A pointer to a pointer to an integerd)int a10;/An array of 10 integerse)int*a10;/An array of 10 pointers to integersf)int(*a)10;/A pointer to an array of 10 integ
11、ersg)int(*a)(int);/A pointer to a function a that takes an integer argument and returns an integerh)int(*a10)(int);/An array of 10 pointers to functions that take an integer argument and return aninteger人 们 经 常 声 称 这 里 有 几 个 问 题 是 那 种 要 翻 一 下 书 才 能 回 答 的 问 题,我 同 意 这 种 说 法。当 我 写 这 篇 文 章 时,为 了 确 定 语 法
12、 的 正 确 性,我 的 确 查 了 一 下 书。但 是 当 我 被 面 试 的 时 候,我 期 望 被 问 到 这 个 问 题(或 者 相 近 的 问 题)。因 为 在 被 面 试 的 这 段 时 间 里,我 确 定 我 知 道 这 个 问 题 的 答 案。应 试 者 如 果 不 知 道 所 有 的 答 案(或 至 少 大 部 分 答 案),那 么 也 就 没 有 为 这 次 面 试 做 准 备,如 果 该 面 试 者 没 有 为 这 次 面 试 做 准 备,那 么 他 又 能 为 什 么 出 准 备 呢?Static6.关 键 字 static的 作 用 是 什 么?这 个 简 单 的 问
13、 题 很 少 有 人 能 回 答 完 全。在 C 语 言 中,关 键 字 static有 三 个 明 显 的 作 用:1)在 函 数 体,一 个 被 声 明 为 静 态 的 变 量 在 这 一 函 数 被 调 用 过 程 中 维 持 其 值 不 变。2)在 模 块 内(但 在 函 数 体 外),一 个 被 声 明 为 静 态 的 变 量 可 以 被 模 块 内 所 用 函 数 访 问,但 不 能 被 模 块 外 其 它 函 数 访 问。它 是 一 个 本 地 的 全 局 变 量。3)在 模 块 内,一 个 被 声 明 为 静 态 的 函 数 只 可 被 这 一 模 块 内 的 其 它 函 数
14、调 用。那 就 是,这 个 函 数 被 限 制 在 声 明 它 的 模 块 的 本 地 范 围 内 使 用。大 多 数 应 试 者 能 正 确 回 答 第 一 部 分,一 部 分 能 正 确 回 答 第 二 部 分,同 是 很 少 的 人 能 懂 得 第 三 部 分。这 是 一 个 应 试 者 的 严 重 的 缺 点,因 为 他 显 然 不 懂 得 本 地 化 数 据 和 代 码 范 围 的 好 处 和 重 要 性。Const7.关 键 字 const有 什 么 含 意?我 只 要 一 听 到 被 面 试 者 说:“const意 味 着 常 数”,我 就 知 道 我 正 在 和 一 个 业 余
15、 者 打 交 道。去 年 Dan S aks己 经 在 他 的 文 章 里 完 全 概 括 了 const的 所 仃 用 法,因 此 ESP(译 者:Embedded Systems Programming)的 每 一 位 读 者 应 该 非 常 熟 悉 const能 做 什 么 和 不 能 做 什 么.如 果 你 从 没 有 读 到 那 篇 文 章,只 要 能 说 出 const意 味 着“只 读”就 可 以 了。尽 管 这 个 答 案 不 是 完 全 的 答 案,但 我 接 受 它 作 为 一 个 正 确 的 答 案。(如 果 你 想 知 道 更 详 细 的 答 案,仔 细 读 一 下 S
16、aks的 文 章 吧。)如 果 应 试 者 能 正 确 回 答 这 个 问 题,我 将 问 他 一 个 附 加 的 问 题:下 面 的 声 明 都 是 什 么 意 思?const int a;int const a;const int*a;int*const a;int const*a const;/*/前 两 个 的 作 用 是 一 样,a 是 一 个 常 整 型 数。第 三 个 意 味 着 a 是 一 个 指 向 常 整 型 数 的 指 针(也 就 是,整 型 数 是 不 可 修 改 的,但 指 针 可 以)。第 四 个 意 思 a 是 一 个 指 向 整 型 数 的 常 指 针(也 就
17、是 说,指 针 指 向 的 整 型 数 是 可 以 修 改 的,但 指 针 是 不 可 修 改 的)。最 后 一 个 意 味 着 a 是 一 个 指 向 常 整 型 数 的 常 指 针(也 就 是 说,指 针 指 向 的 整 型 数 是 不 可 修 改 的,同 时 指 针 也 是 不 可 修 改 的)。如 果 应 试 者 能 正 确 回 答 这 些 问 题,那 么 他 就 给 我 留 下 了 一 个 好 印 象。顺 带 提 一 句,也 许 你 可 能 会 问,即 使 不 用 关 键 字 c o n s t,也 还 是 能 很 容 易 写 出 功 能 正 确 的 程 序,那 么 我 为 什 么
18、还 要 如 此 看 重 关 键 字 const呢?我 也 如 下 的 几 下 理 由:1)关 键 字 const的 作 用 是 为 给 读 你 代 码 的 人 传 达 非 常 有 用 的 信 息,实 际 上,声 明 一 个 参 数 为 常 量 是 为 了 告 诉 了 用 户 这 个 参 数 的 应 用 目 的。如 果 你 曾 花 很 多 时 间 清 理 其 它 人 留 下 的 垃 圾,你 就 会 很 快 学 会 感 谢 这 点 多 余 的 信 息。(当 然,懂 得 用 const的 程 序 员 很 少 会 留 下 的 垃 圾 让 别 人 来 清 理 的。)2)通 过 给 优 化 器 一 些 附
19、 加 的 信 息,使 用 关 键 字 const也 许 能 产 生 更 紧 凑 的 代 码。3)合 理 地 使 用 关 键 字 const可 以 使 编 译 器 很 自 然 地 保 护 那 些 不 希 望 被 改 变 的 参 数,防 止 其 被 无 意 的 代 码 修 改。简 而 言 之,这 样 可 以 减 少 b u g的 出 现。Volatile8.关 键 字 volatile有 什 么 含 意?并 给 出 三 个 不 同 的 例 子。一 个 定 义 为 volatile的 变 量 是 说 这 变 量 可 能 会 被 意 想 不 到 地 改 变,这 样,编 译 器 就 不 会 去 假 设
20、这 个 变 量 的 值 了。精 确 地 说 就 是,优 化 器 在 用 到 这 个 变 量 时 必 须 每 次 都 小 心 地 重 新 读 取 这 个 变 量 的 值,而 不 是 使 用 保 存 在 寄 存 器 里 的 备 份。下 面 是 volatile变 量 的 几 个 例 子:1)并 行 设 备 的 硬 件 寄 存 器(如:状 态 寄 存 器)2)一 个 中 断 服 务 子 程 序 中 会 访 问 到 的 非 自 动 变 量(Non-automaticvariables)3)多 线 程 应 用 中 被 儿 个 任 务 共 享 的 变 量 回 答 不 出 这 个 问 题 的 人 是 不 会
21、 被 雇 佣 的。我 认 为 这 是 区 分 C 程 序 员 和 嵌 入 式 系 统 程 序 员 的 最 基 本 的 问 题。搞 嵌 入 式 的 家 伙 们 经 常 同 硬 件、中 断、RTOS等 等 打 交 道,所 有 这 些 都 要 求 用 到 volatile变 量。不 懂 得 volatile的 内 容 将 会 带 来 灾 难。假 设 被 面 试 者 正 确 地 回 答 了 这 是 问 题(嗯,怀 疑 是 否 会 是 这 样),我 将 稍 微 深 究 一 下,看 吓 这 家 伙 是 不 是 直 正 懂 得 volatile完 全 的 重 要 性。1)一 个 参 数 既 可 以 是 co
22、nst还 可 以 是 volatile吗?解 释 为 什 么。2);一 个 指 针 可 以 是 vo la tile吗?解 释 为 什 么。3);卜 一 面 的 函 数 有 什 么 错 误:int square(volatile int*ptr)(return*ptr*ptr;)下 面 是 答 案:1)是 的。个 例 子 是 只 读 的 状 态 寄 存 器。它 是 volatile因 为 它 可 能 被 意 想 不 到 地 改 变。它 是 const因 为 程 序 不 应 该 试 图 去 修 改 它。2);是 的。尽 管 这 并 不 很 常 见。一 个 例 子 是 当 一 个 中 服 务 子
23、程 序 修 该 一 个 指 向 一 个 buffer的 指 针 时。3)这 段 代 码 有 点 变 态。这 段 代 码 的 目 的 是 用 来 返 指 针*ptr指 向 值 的 平 方,但 是,由 于*ptr指 向 一 个 volatile型 参 数,编 译 器 将 产 生 类 似 卜 面 的 代 码:int square(volatile int*ptr)(int a,b;a=*ptr;b=*ptr;return a*b;)由 于*p tr的 值 可 能 被 意 想 不 到 地 该 变,因 此 a 和 b 可 能 是 不 同 的。结 果,这 段 代 码 可 能 返 不 是 你 所 期 望 的
24、 平 方 值!正 确 的 代 码 如 下:long square(volatile int*ptr)(int a;a=*ptr;return a*a;)位 操 作(Bit manipulation)9.嵌 入 式 系 统 总 是 要 用 户 对 变 量 或 寄 存 器 进 行 位 操 作。给 定 一 个 整 型 变 量 a,写 两 段 代 码,第 一 个 设 置 a的 b it 3,第 二 个 清 除 a 的 bit3。在 以 上 两 个 操 作 中,要 保 持 其 它 位 不 变。对 这 个 问 题 有 三 种 基 本 的 反 应 1)不 知 道 如 何 下 手。该 被 面 者 从 没 做
25、过 任 何 嵌 入 式 系 统 的 工 作。2)用 bit fields。Bit fields是 被 扔 到 C语 言 死 角 的 东 西,它 保 证 你 的 代 码 在 不 同 编 译 器 之 间 是 不 可 移 植 的,同 时 也 保 证 了 的 你 的 代 码 是 不 可 重 用 的。我 最 近 不 幸 看 到 I崎 neon为 其 较 复 杂 的 通 信 芯 片 写 的 驱 动 程 序,它 用 到 了 bit fields因 此 完 全 对 我 无 用,因 为 我 的 编 译 器 用 其 它 的 方 式 来 实 现 bit fields的。从 道 德 讲:永 远 不 要 让 一 个 非
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C_C 笔试 汇总
限制150内