声 明 和 定 义 严 格 说, 声 明 (declaration) 和 定 义 (definition) 不 一 样 声 明 : 定 义 : 说 明 一 个 事 物 的 存 在 和 它 的 一 些 属 性, 例 如 变 量 与 其 类 型 根 据 声 明 可 以 确 定 被 声 明 事 物 的 使 用 方 式 对 象 声 明 并 不 实 际 建 立 对 象 例 如 :C 语 言 的 外 部 (extern) 变 量 声 明, 函 数 原 型 声 明 是 声 明, 具 有 说 明 同 样 的 基 本 作 用 对 象 定 义 要 求 程 序 运 行 时 创 建 被 定 义 对 象 对 于 子 程 序, 需 要 提 供 子 程 序 的 体 对 于 变 量, 可 能 提 供 变 量 的 初 始 值, 造 成 的 实 际 动 作 包 括 为 变 量 分 配 存 储 和 可 能 的 初 始 化 一 些 语 言 的 标 准 里 严 格 区 分 了 两 种 情 况, 有 些 没 严 格 区 分 这 两 个 术 语 2012 年 3 月 23 作 用 域 定 义 ( 声 明 ) 建 立 名 字 与 事 物 之 间 的 约 束, 这 一 约 束 在 源 程 序 里 ( 在 源 程 序 的 正 文 里 ) 的 作 用 范 围 称 为 这 一 约 束 的 作 用 域 (scope), 也 说 是 这 个 定 义 或 声 明 的 作 用 域 声 明 有 确 定 的 作 用 范 围 ( 作 用 域 ), 只 在 确 定 范 围 里 有 效 在 声 明 的 作 用 域 里, 被 声 明 名 字 指 称 相 应 的 对 象 我 们 ( 人 / 语 言 处 理 器 ) 根 据 作 用 域 确 定 一 个 名 字 对 应 的 事 物 例 :C 局 部 变 量 在 其 定 义 所 在 的 复 合 语 句 里 可 用 ( 从 定 义 位 置 开 始 ) 局 部 变 量 定 义 的 作 用 域 就 是 这 个 复 合 语 句, 从 定 义 开 始 作 用 域 单 位 : 通 常 规 定 一 些 程 序 结 构 作 为 名 字 / 对 象 约 束 的 作 用 域 不 同 语 言 里 的 规 定 可 能 不 同 常 见 作 用 域 单 位 : 子 程 序 / 函 数, 复 合 语 句, 类, 等 等 2012 年 3 月 24
作 用 域 早 期 Fortran 的 作 用 域 结 构 很 简 单 由 于 人 们 认 识 到 信 息 局 部 化 的 重 要 性, 引 进 了 许 多 作 用 域 单 位 Algol 60 引 进 块 (block) 结 构 作 为 基 本 作 用 域 单 位 允 许 任 意 嵌 套 的 局 部 作 用 域 子 程 序 看 作 是 有 名 字 且 可 被 调 用 的 块 现 在 一 般 语 言 都 以 子 程 序 ( 过 程 / 函 数 ) 作 为 作 用 域 单 位, 一 些 语 言 允 许 子 程 序 体 内 部 的 嵌 套 作 用 域 ( 如 C 的 复 合 语 句 ) 其 他 作 用 域 单 位 : 结 构 / 记 录 的 声 明,OO 语 言 里 的 类 定 义 ( 声 明 ) 模 块 结 构 ( 如 C++ 的 名 字 空 间,Ada 的 包 ) C 源 文 件, 也 是 一 种 作 用 域 单 位 (static 外 部 函 数 和 变 量 的 作 用 域 ) 学 习 一 种 语 言 时, 必 须 弄 清 楚 语 言 中 有 哪 些 作 用 域 单 位 2012 年 3 月 25 作 用 域 : 作 用 域 单 位 不 同 语 言 对 作 用 域 单 位 和 作 用 域 有 一 些 不 同 的 规 定 例 如 : 一 些 语 言 里 有 全 局 作 用 域, 供 定 义 全 局 的 标 识 符 与 对 象 ( 和 其 他 事 物 ) 的 约 束 除 全 局 作 用 域 外 的 其 他 作 用 域 都 是 局 部 的 C 语 言 的 全 局 作 用 域 里 可 以 定 义 / 声 明 变 量 函 数 类 型 等 函 数 只 允 许 定 义 在 全 局 作 用 域 里 ( 不 允 许 在 函 数 内 部 嵌 套 定 义 函 数 ) C 语 言 的 局 部 作 用 域 是 复 合 语 句 ( 函 数 体 也 是 复 合 语 句 ) C++ 对 C 的 作 用 域 做 了 许 多 扩 充 在 Java 语 言 的 全 局 作 用 域 里 只 能 定 义 类, 其 他 的 实 体 都 只 能 定 义 在 类 内 部 的 各 种 局 部 作 用 域 里 Fortran 只 有 全 局 作 用 域 和 子 程 序 作 用 域, 子 程 序 内 部 没 有 嵌 套 作 用 域 Basic( 老 的 ) 只 有 一 个 全 局 作 用 域, 所 有 变 量 定 义 都 在 一 个 作 用 域 里 定 义 在 子 程 序 里 的 变 量 也 具 有 全 局 作 用 域 ( 难 以 编 写 大 程 序 ) 2012 年 3 月 26
作 用 域 2012 年 3 月 27 作 用 域 : 冲 突 和 嵌 套 通 常 规 定 : 在 一 个 作 用 域 里 同 一 个 名 字 不 能 有 多 个 约 束 ( 名 字 冲 突, 一 个 名 字 具 有 多 个 约 束 的 现 象 称 为 重 载,overloading) 不 同 作 用 域 里 的 名 字 相 互 无 关 作 用 域 可 能 嵌 套 : 局 部 作 用 域 位 于 全 局 作 用 域 里, 局 部 作 用 域 里 可 能 还 有 内 部 的 作 用 域 同 一 名 字 的 不 同 定 义 可 能 出 现 作 用 域 重 叠 此 时 会 出 现 了 作 用 域 的 空 洞 ( 图 ) 规 定 : 内 层 定 义 遮 蔽 外 层 定 义 为 了 易 理 解, 应 避 免 同 名 对 象 的 作 用 域 嵌 套 int n; int p (int n) { double x; n x int main () { int x; double y; n x y if ( ) { int n = 3; n x y for ( ) { int n; int y; n x y n x y n x y 2012 年 3 月 28
作 用 域 : 嵌 套 在 作 用 域 空 洞 里,( 被 遮 蔽 的 ) 外 层 定 义 的 东 西 不 能 用 ( 其 定 义 不 可 见 ), 直 接 写 出 的 名 字 总 是 表 示 当 时 的 最 内 层 约 束 为 了 编 程 方 便, 一 些 语 言 提 供 了 带 修 饰 名 字 形 式, 通 过 为 名 字 加 前 缀 修 饰 的 方 式 指 定 对 外 层 ( 定 义 ) 约 束 的 访 问 ( 有 些 语 言 的 机 制 有 限 制 ) 例 :C++ 的 :: 是 作 用 域 解 析 运 算 符, 可 以 用 ::nm 的 形 式 表 示 引 用 全 局 定 义, 用 cn::nm 的 方 式 引 用 特 定 namespace 或 者 类 里 的 定 义 在 Ada 里, 每 个 块 (block) 都 可 以 命 名, 利 用 块 名 作 为 前 缀, 可 以 引 用 外 围 块 定 义 的 约 束 ( 就 像 引 用 结 构 / 记 录 的 成 员 ) 一 个 语 言 里 可 能 存 在 多 种 作 用 域 单 位, 许 多 作 用 域 单 位 允 许 嵌 套 因 此, 写 程 序 时 需 要 特 别 注 意 约 束 被 遮 蔽 的 问 题 语 言 里 可 命 名 的 不 仅 是 变 量, 还 有 函 数 / 过 程, 类 型, 常 量, 结 构 ( 记 录 ) 的 成 分, 等 等 它 们 都 遵 循 语 言 的 作 用 域 规 则, 有 时 有 特 殊 规 则 2012 年 3 月 29 静 态 / 动 态 作 用 域 规 则 作 用 域 规 则 (Scope rule Static, Dynamic): 对 于 程 序 中 任 一 特 定 位 置 的 一 个 名 字, 确 定 与 之 约 束 的 对 象 的 方 法 局 部 定 义 的 约 束 容 易 确 定, 关 键 是 非 局 部 定 义 ( 非 局 部 ) 名 的 约 束 int y = 3; 静 态 作 用 域 规 则 : 对 非 局 部 名 字, 其 约 束 根 inline void f(int void x) f(int { x){ 据 名 字 出 现 位 置 的 静 态 正 文 环 境 确 定 #define f(x) \ printf("%d", x+y); 动 态 作 用 域 规 则 : 非 局 部 名 的 约 束 根 据 当 时 的 动 态 运 行 环 境 确 定.........{ 常 规 语 言 都 采 用 静 态 作 用 域 规 则, 函 数 f 中 int y = 4; 非 局 部 的 y 约 束 于 函 数 的 静 态 环 境 里 的 y f(2);...... 有 些 函 数 式 语 言 采 用 动 态 作 用 域 规 则 对 子 程 序 中 的 非 局 部 变 量 采 用 静 态 作 用 域 规 则 确 定 约 束 对 象, 语 义 清 晰, 但 实 现 有 些 复 杂 ( 在 有 关 子 程 序 控 制 的 一 章 讨 论 ) 2012 年 3 月 30
作 用 域 规 则 和 动 态 约 束 在 一 个 语 言 里, 有 可 能 对 不 同 的 程 序 结 构 采 用 不 同 的 作 用 域 规 则 完 全 可 能 在 某 些 地 方 采 用 特 殊 的 规 则 例 如 :OO 语 言 里 最 重 要 的 方 法 约 束 ( 绑 定 ) 问 题, 也 是 根 据 名 字 确 定 应 该 使 用 的 对 象 的 问 题 ( 确 定 应 该 执 行 的 方 法 体 动 态? 静 态?) 右 边 代 码 方 法 m1 的 约 束 ( 方 法 也 是 对 象 ) 如 何 确 定? 是 B 类 里 的 方 法 m1, 或 也 可 能 是 其 他 类 里 的 方 法?( 是 根 据 程 序 正 文 静 态 确 定? 还 是 根 据 程 序 运 行 中 的 情 况 动 态 确 定?) C++ 语 言 支 持 两 种 方 式 ( 非 虚 方 法 和 虚 方 法 ) int fun (B & o) {... o.m1(...);... Java 语 言 统 一 采 用 动 态 规 则 OO 语 言 中 方 法 的 约 束 问 题 在 后 面 讨 论 2012 年 3 月 31 作 用 域 : 实 例 不 同 语 言 的 作 用 域 设 计 可 能 不 同, 每 个 语 言 有 一 套 规 定 Pascal 语 言 : program 作 用 域 ( 类 似 全 局 作 用 域 ) 允 许 任 意 嵌 套 的 子 程 序 ( 函 数 / 过 程 ) 作 用 域 只 有 子 程 序 是 局 部 的 作 用 域 单 位, 子 程 序 里 没 有 嵌 套 的 作 用 域 C 语 言 : 全 局 的 外 部 作 用 域 子 程 序 定 义 的 局 部 作 用 域 ( 不 允 许 嵌 套 定 义 的 子 程 序 ) 子 程 序 里 任 意 嵌 套 的 复 合 语 句 作 用 域 文 件 为 单 位 的 全 局 static 作 用 域 ( 目 的 是 信 息 局 部 化 ) 2012 年 3 月 32
作 用 域 : 实 例 C++ 语 言 C 语 言 的 各 种 作 用 域 类 定 义 形 成 的 作 用 域 ( 类 似 的 还 有 结 构 和 联 合 ) 继 承 关 系 形 成 的 作 用 域 嵌 套 ( 子 类 里 可 以 访 问 父 类 的 成 员 ) 方 法 的 作 用 域 嵌 套 在 类 作 用 域 里 ( 因 此 可 以 直 接 引 用 类 成 员 ) 由 namespace 定 义 的 模 块 ( 名 字 空 间 ) 作 用 域 Java 语 言 全 局 作 用 域 里 只 能 定 义 类 ( 全 局 作 用 域 里 没 有 对 象 名 ) 类 定 义 形 成 作 用 域 方 法 作 用 域 嵌 套 在 类 作 用 域 里 由 package 形 成 的 模 块 ( 包 ) 作 用 域 2012 年 3 月 33 作 用 域 : 细 节 一 个 定 义 / 声 明 的 作 用 域, 常 见 的 有 两 种 规 定 : 定 义 的 作 用 域 从 定 义 出 现 的 位 置 到 当 前 作 用 域 结 束 定 义 的 作 用 域 包 括 整 个 当 前 作 用 域 两 个 例 子 : int n = 2; int f ( ) { int n = n+1, m = n+1; C: 作 用 域 从 声 明 结 束 点 开 始 int n = 2; class C { int f() { n++; int n; C++: 类 成 员 的 作 用 域 是 整 个 类 定 义 语 言 对 于 声 明 的 作 用 域 的 范 围 都 有 明 确 规 定 相 关 规 定 有 时 很 繁 杂, 存 在 许 多 细 节, 需 要 仔 细 阅 读 语 言 手 册 2012 年 3 月 34
作 用 域 和 可 见 性 访 问 控 制 :C++ 把 操 作 系 统 的 访 问 控 制 概 念 引 进 了 程 序 设 计 语 言, 带 来 一 些 新 的 概 念 和 问 题 ( 后 面 讨 论 ) 作 用 域 进 入 和 退 出 的 特 殊 描 述 方 式 :. 运 算 符 许 多 语 言, 由 整 体 进 入 成 分, 如 对 结 构 变 量 :: 运 算 符 C++ 等 面 向 对 象 语 言, 从 类 / 名 字 空 间 到 成 员 Pascal 的 with 语 句 等 等 后 面 讨 论 模 块 概 念 时 还 会 提 到 这 方 面 的 一 些 细 节 2012 年 3 月 35 其 他 实 体 的 命 名 和 作 用 域 程 序 里 的 命 名 实 体 还 很 多 现 在 简 单 讨 论 类 型 标 号 的 问 题 类 型 通 常 只 在 静 态 处 理 过 程 中 有 效, 采 用 通 用 的 静 态 作 用 域 规 则 类 型 定 义 也 可 能 由 于 嵌 套 作 用 域 里 的 重 新 定 义 而 被 覆 盖 标 号 : 标 明 代 码 中 的 一 个 位 置, 作 为 goto 的 目 标 有 些 语 言 里 标 号 的 作 用 域 有 特 殊 规 定 C 语 言 的 标 号, 作 用 域 是 整 个 函 数, 允 许 向 前 或 向 后 跳 到 标 号 允 许 跳 入 跳 出 嵌 套 的 复 合 语 句 内 层 控 制 结 构 ( 对 于 跳 入 位 置 引 起 的 语 义 不 清 晰 情 况, 语 言 不 予 定 义 如 跳 入 循 环 后 循 环 变 量 的 值 等 ) Fortran 标 号 的 作 用 域 是 整 个 子 程 序 存 在 与 C 语 言 类 似 的 问 题 Pascal 标 号 要 求 先 声 明, 用 无 符 号 整 数 表 示, 作 用 域 是 定 义 所 在 的 整 个 子 程 序 ( 包 括 嵌 套 定 义 的 子 程 序 ) 不 允 许 跳 入 嵌 套 的 控 制 结 构, 但 允 许 从 内 层 子 程 序 里 跳 回 外 层 子 程 序 ( 非 局 部 转 跳, 导 致 复 杂 的 控 制 转 移 ) 2012 年 3 月 36
名 字 分 类 程 序 里 有 多 种 命 名 事 物 ( 命 名 对 象 类 型 结 构 的 成 分 名, 标 号 等 等 ), 有 些 语 言 对 名 字 做 了 分 类 同 一 作 用 域 里 属 于 不 同 类 别 的 名 字 互 不 冲 突 一 般 规 定 ( 在 一 个 作 用 域 里 ) 同 类 事 物 的 名 字 不 能 冲 突 但 也 有 语 言 允 许 名 字 重 载 ( 一 个 名 字 有 多 重 意 义, 下 面 讨 论 ) 例 :C 语 言 规 定 了 三 个 名 字 类 (C 语 言 手 册 里 称 为 名 字 空 间 ) 标 号 名 struct/union/enum 标 志 变 量 名 函 数 名 类 型 名 typedef 名 枚 举 常 量 名 此 外, 每 个 结 构 或 联 合 声 明 也 是 一 个 名 字 空 间 ( 包 含 其 中 的 各 成 分 名 ) 规 定 程 序 里 的 名 字 分 属 不 同 类 别, 要 求 语 言 的 实 现 能 区 分 它 们 采 用 怎 样 的 规 定, 与 语 言 里 各 种 特 征 的 设 计 有 关 2012 年 3 月 37 名 字 重 载 在 同 一 作 用 域 里, 一 个 名 字 约 束 于 多 个 对 象 的 情 况 称 为 重 载 最 常 见 的 重 载 实 例 是 算 术 运 算 符 + 运 算 符 通 常 表 示 多 种 加 法 运 算 一 些 语 言 允 许 程 序 员 定 义 的 名 字 重 载, 主 要 目 的 是 为 了 提 高 程 序 的 可 读 性, 以 及 支 持 某 些 很 有 重 要 的 程 序 设 计 技 术 例 :C++ 的 重 载 对 于 继 承 定 义 构 造 函 数 完 成 初 始 化, 支 持 面 向 对 象 编 程 的 基 本 特 征 等 都 是 必 不 可 少 的 允 许 重 载, 就 必 须 能 有 效 进 行 重 载 解 析 : 对 重 载 名 的 每 个 使 用, 都 能 确 定 应 该 实 际 使 用 该 名 字 的 哪 个 定 义 ( 哪 个 与 之 关 联 的 对 象 ) 方 法 : 根 据 名 字 出 现 的 静 态 或 动 态 环 境, 确 定 应 使 用 的 对 象 静 态 解 析 : 在 编 译 时 利 用 静 态 上 下 文 信 息 确 定 名 字 的 正 确 约 束, 主 要 是 利 用 类 型 信 息, 确 定 应 该 使 用 的 定 义 ( 例 : 加 法 运 算 符 的 解 析 ) 动 态 解 析 : 利 用 动 态 的 上 下 文 信 息 如 OO 语 言 的 方 法 动 态 指 派 2012 年 3 月 38
对 象 和 值 : 值 程 序 对 象 通 常 都 有 约 束 值 根 据 可 做 的 操 作 不 同, 值 有 如 下 分 类 : 一 级 值 (first-class value): 可 以 赋 给 变 量 作 为 参 数 传 入 子 程 序 作 为 函 数 返 回 值 的 数 据 或 对 象 ( 可 能 有 更 多 要 求, 如 可 以 运 行 中 构 造 ) 二 级 值 : 可 以 传 入 子 程 序, 但 不 能 返 回 也 不 能 赋 值 三 级 值 : 不 能 传 入 子 程 序 ( 除 二 级 值 的 限 制 外 ) 在 大 部 分 语 言 里, 简 单 类 型 ( 整 数 字 符 等 ) 的 值 都 是 一 级 值 C 语 言 里 的 指 针 和 结 构 是 一 级 的 值, 数 组 是 三 级 值 注 意 : 在 C 里, 数 组 名 放 在 赋 值 符 右 边 不 是 做 数 组 赋 值, 作 为 参 数 也 不 是 传 递 数 组 还 应 注 意 : 字 符 串 也 是 数 组 在 一 些 语 言 里, 子 程 序 也 是 一 级 值 Scheme 里 子 程 序 可 以 赋 值 传 入 传 出 子 程 序 可 以 在 运 行 中 动 态 地 构 造 子 程 序 值 ( 由 此 发 展 出 许 多 高 级 程 序 设 计 技 术 ) C# 和 Java 支 持 lambda 表 达 式, 就 是 想 支 持 一 级 的 子 程 序 值 构 造 2012 年 3 月 39 对 象 和 值 现 在 讨 论 对 象 和 值 的 关 系 对 象 的 值 约 束 有 两 种 基 本 方 式 : 1, 值 保 存 在 对 象 的 存 储 区 里, 这 种 方 式 称 为 值 语 义 ( 值 模 型 ) A 值 简 单 表 示 : 345 2, 对 象 ( 例 如 A) 的 值 是 另 一 对 象 ( 例 如 B), 对 象 A 的 存 储 区 里 存 着 对 B 的 引 用, 对 象 B 里 保 存 实 际 数 据 称 为 引 用 语 义 ( 引 用 模 型 ) A 被 引 用 的 对 象 常 常 是 匿 名 对 象, 有 的 语 言 支 持 对 有 名 字 的 对 象 的 引 用 C 语 言 里 的 变 量 都 采 用 值 语 义 Java 里 基 本 类 型 的 变 量 采 用 值 语 义, 其 他 类 型 的 变 量 都 采 用 引 用 语 义 B 值 例 :int[] a = {1,2,3; 1, 2, 3 变 量 a 值 对 象 2012 年 3 月 40
变 量 变 量 是 一 种 命 名 程 序 对 象, 它 的 作 用 是 保 存 值, 所 保 存 的 值 可 以 在 程 序 执 行 中 改 变 ( 与 值 的 约 束 可 动 态 改 变, 一 般 是 通 过 赋 值 操 作 ) 常 变 量 : 一 种 变 量, 其 值 在 创 建 时 给 定, 生 存 期 间 不 变 许 多 语 言 里 的 变 量 / 常 变 量 都 是 通 过 变 量 / 常 量 定 义 创 建 在 一 些 语 言 里, 变 量 定 义 具 有 特 殊 的 语 法 地 位 ( 如 Pascal,Ada,C), 只 能 出 现 在 特 定 的 语 法 位 置 一 些 语 言 把 变 量 定 义 看 作 一 种 语 句, 可 出 现 在 任 何 可 以 写 语 句 的 地 方 例 :C++ 把 变 量 定 义 看 作 语 句 还 允 许 出 现 在 一 些 特 殊 位 置 : while (int n =...) {...... for (int n =...;...;...) {...... 还 可 写 在 if 和 switch 头 部 ( 基 本 想 法 : 使 定 义 点 尽 量 接 近 使 用 点 ) 2012 年 3 月 41 变 量 和 属 性 有 些 语 言 里 变 量 不 需 要 定 义, 遇 到 新 标 识 符 自 动 定 义 新 变 量 这 时 要 解 决 : 所 出 现 的 变 量 的 使 用 范 围 ( 相 关 规 定 可 能 有 很 多 细 节 ) 变 量 的 属 性 如 何 确 定 ( 例 如 类 型, 可 以 如 何 使 用 ) Fortran 语 言 有 I-N 规 则, 名 字 以 I 到 N 开 头 的 是 整 型 变 量, 其 余 是 实 型 采 用 这 种 方 式 的 新 语 言 主 要 是 脚 本 语 言 解 释 性 语 言, 其 变 量 无 类 型 变 量 的 基 本 属 性 : 名 字 类 型 常 性 (const) 等 复 合 变 量 对 象 : 数 组 的 维 数 和 各 维 的 上 下 界 结 构 ( 记 录 ) 的 成 员 名 字 和 类 型 其 他 如 C 语 言 的 存 储 类 static( 局 部 变 量 ), 可 见 性 static( 外 部 变 量 ) 2012 年 3 月 42
变 量 和 属 性 由 于 语 言 不 同 或 者 情 况 不 同, 变 量 的 属 性 可 能 : 关 联 于 变 量 的 标 识 ( 变 量 名 ), 只 是 静 态 可 用 ( 静 态 属 性 ) 关 联 于 程 序 对 象 或 者 值 ( 对 象 ), 是 动 态 属 性, 在 执 行 中 可 用 在 源 程 序 里, 变 量 名 ( 变 量 标 识 ) 代 表 相 应 的 变 量 与 变 量 名 关 联 的 程 序 对 象 是 变 量 的 运 行 时 的 实 体 体 现 其 他 属 性 可 能 只 是 静 态 可 用, 或 者 动 态 也 可 以 用 例 如 C 语 言 的 数 组 大 小, 只 为 分 配 空 间 用 一 些 语 言 的 数 组 大 小 在 运 行 环 境 里 可 用, 支 持 动 态 越 界 检 查 变 量 名 与 相 应 对 象 的 约 束 是 静 态 的 对 象 与 值 的 约 束 是 动 态 的, 可 变 变 量 名 程 序 对 象 值 静 态 特 征 2012 年 3 月 43 属 性 动 态 特 征 变 量 和 属 性 纯 编 译 的 语 言 ( 如 C 和 Fortran) 设 计 目 标 之 一 就 是 保 证 变 量 的 所 有 属 性 都 可 作 为 静 态 属 性, 只 在 编 译 中 使 用 和 检 查 运 行 时 的 变 量 对 象 没 有 值 以 外 的 属 性 运 行 中 不 做 任 何 动 态 检 查 ( 没 有 信 息, 不 可 能 检 查 ) 以 保 证 程 序 的 紧 凑 性 和 执 行 效 率 C 的 目 标 模 块 里 没 有 任 何 类 型 信 息 没 有 函 数 的 参 数 和 返 回 值 信 息, 没 有 全 局 变 量 的 类 型 信 息 连 接 时 只 考 虑 名 字 对 应, 类 型 安 全 性 只 靠 源 程 序 文 件 里 的 局 部 信 息 许 多 语 言 要 求 为 某 些 程 序 对 象 保 留 一 些 属 性 信 息 : 要 在 运 行 时 做 数 组 访 问 越 界 检 查, 就 必 须 保 留 维 数 与 上 下 界 信 息 OO 语 言 支 持 方 法 动 态 约 束 和 基 于 类 的 指 派, 需 要 在 对 象 里 保 存 信 息 2012 年 3 月 44
初 始 化 和 赋 值 变 量 取 得 值 的 基 本 方 式 初 始 化 : 在 定 义 时 给 被 定 义 的 变 量 提 供 一 个 初 值 赋 值 : 为 已 有 值 的 变 量 赋 予 新 值 提 供 初 始 化 机 制 的 意 义 : 静 态 分 配 的 变 量 的 初 始 化 如 果 能 静 态 做, 可 以 避 免 动 态 运 行 开 销 可 帮 助 避 免 由 于 忘 记 初 始 化 就 使 用, 或 者 不 正 确 的 初 始 化 而 造 成 的 程 序 错 误 ( 很 常 见 的 一 类 程 序 错 误 ) 一 些 语 言 规 定 了 默 认 的 初 始 值 如 果 变 量 定 义 时 没 有 给 初 始 值, 就 自 动 赋 予 默 认 的 初 始 值 常 用 0 空 指 针 等 作 为 变 量 的 默 认 初 值 但 提 供 默 认 初 始 值, 也 就 排 除 了 检 查, 有 可 能 影 响 程 序 的 安 全 性 2012 年 3 月 45 初 始 化 和 赋 值 例 :C 语 言 对 静 态 分 配 的 所 有 变 量 用 全 0 二 进 制 序 列 初 始 化 因 此, 如 果 没 有 另 外 初 始 化, 数 值 变 量 正 好 取 值 0, 指 针 变 量 取 空 指 针 值 动 态 创 建 的 变 量 ( 自 动 变 量 ) 没 有 默 认 初 始 化, 是 为 了 程 序 效 率 动 态 分 配 的 匿 名 变 量 可 以 选 择 分 配 函 数, 做 或 不 做 默 认 初 始 化 例 :Java 要 求 在 每 个 变 量 使 用 前 都 必 须 做 定 义 性 赋 值 ( 初 始 化 ) 规 定 : 在 到 达 每 个 变 量 的 每 个 使 用 点 的 每 条 控 制 路 径 上, 都 必 须 明 确 地 出 现 对 该 变 量 的 赋 值 这 样 可 以 保 证 不 出 现 使 用 未 初 始 化 的 变 量 的 情 况, 基 于 设 计 Java 语 言 时 对 程 序 安 全 性 的 总 体 考 虑 这 个 规 定 是 静 态 要 求, 可 以 在 编 译 时 静 态 检 查 这 是 一 个 充 分 条 件, 可 能 并 不 必 要 2012 年 3 月 46