目 录
第 一 部 分 Microsoft Visual C 6.0 语 言 参 考 手 册
引 言
第 1 章 C 的 基 本 元 素第 2 章 程 序 结 构
第 3 章 说 明 和 类
第 4 章 表 达 式 和 赋 值第 5 章 语 句
第 6 章 函 数
附 录 |
A |
C 语 言 语 法 总 结 |
---|---|---|
附 录 |
B |
实 现 定 义 的 行 为 |
第 二 部 分 M icrosoft Visual C++ 6.0 语 言 参 考 手 册
引 言 C++ 语 言 参 考 手 册 的 组 织第 1 章 词 法 规 定
第 2 章 基 本 概 念第 3 章 标 准 转 换第 4 章 表 达 式第 5 章 语 句
第 6 章 说 明第 7 章 说 明 符
第 8 章 类
第 9 章 派 生 类
第 10 章 成 员 访 问 控 制第 11 章 特 殊 成 员 函 数第 12 章 重 载
附 录 A 语 法 总 结
附 录 B Microsoft 特 殊 修 饰 符附 录 C 编 译 器 COM 支 持 类
附 录 D 图表
第 三 部 分 M icrosoft Visual C++ 6.0 预 处 理 器 参 考 手 册
引 言
第 1 章 预 处 理 器
第 2 章 编 译 指 示 指 令附 录 语 法 总 结
返 回 总 目 录
M icrosoft Visual C 6 .0
语 言 参 考 手 册
第 一 部 分 目 录
第 1 章 C 的 基 本 元 素 8
第 5 章 语 句 219
第 6 章 函 数 247
附 录 A C 语 言 语 法 总 结 286
引 言
C 语 言 参 考 手 册 的 组 织
-
C 的 基 本 元 素
-
程 序 结 构
-
说 明 和 类 型
-
表 达 式 和 赋 值
-
语 句
-
函 数
-
C 语 言 语 法 总 结
-
实 现 定 义 的 行 为
本 手 册 的 范 围
C 是 一 种 灵 活 的 语 言 , 它 把 很 多 程 序 设 计 决 定 交 给 你 。 为 了 实 现 这 种 想法 ,C 规 定
了 很 少 的 限 制 , 如 类 型 转 换 。 尽 管 这 种 语 言 特 征 使 得 程 序 设 计 工 作 更 容易 ,但 你 必 须 知 道 这 种 语 言 ,掌 握 程 序 的 行 为 。 本 章 提 供 了 C 语 言 组 成 成分 的 信 息 和 M icrosoft 实 现 的 特 征 。C 语 言 的 语 法 来 自 ANSI X3.159-1989 美 国 国 家 信 息 系 统 — — 程 序 设 计 语 言 — — C 标 准 ( 简 称 为 ANSI C 标 准 ),
但 它 不 是 ANSI C 标 准 部 分 。 附 录 A “ C 语 言 语 法 总 结 ” 提 供 了 该 语 法以 及 如 何 读 和 使 用 该 语 法 定 义 的 描 述 。
本 书 没 有 讨 论 C++ 的 程 序 设 计 , 有 关 C++ 语 言 的 信 息 参 见 “ M icrosoft Visual C++ 6.0 参 考 库 ” 的 “ Microsoft Visual C++ 6.0 语 言 参 考 ” 卷 。
ANSI 一 致 性
Microsoft C 符 合 ANSI C 标 准 中 宣 布 的 C 语 言 的 标 准 ,Microsoft 扩 充 了ANSI C 标 准 ,在 本 书 的 文 本 和 语 法 中 以 及 联 机 参 考 中 另 给 以 注 记 。 因 为这 些 扩 充 不 是 ANSI 标 准 的 一 部 分 ,这 些 使 用 可 能 限 制 了 系 统 之 间 程 序 的移 植 性 。 缺 省 地 ,M icrosoft 扩 充 是 允 许 的 ,为 了 禁 止 这 些 扩 充 , 指 定 /Za 编译 器 选 项 。 使 用 /Za ,非 ANSI 代 码 会 产 生 错 误 或 警 告 。
第 1 章 C 的 基 本 元 素
本 章 描 述 了 C 程 序 语 言 的 组 成 元 素 ,包 括 用 于 构 造 一 个 C 程 序 的 名 称 、数 组 和 字 符 。 ANSI C 语 法 称 这 些 组 成 元 素 为 “ 语 言 符 号 ” ,本 章 解 释 如何 定 义 语 言 符 号 以 及 编 译 器 如 何 对 它 们 求 值 的 。
包 括 如 下 主 题 :
-
语 言 符 号
-
注 释
-
关 键 词
-
标 识 符
-
常 量
-
字 符 串 文 字
-
标 点 和 特 定 字 符
本 章 还 包 括 三 字 母 、 浮 点 常 量 、 整 数 常 量 和 转 义 序 列 的 参 考 表 。
“ 运 算 符 ” 是 指 定 值 如 何 操 作 的 符 号 ( 有 单 字 符 和 字 符 组 合 ),每 个 符 号 都解 释 为 单 个 单 元 ,称 为 一 个 语 言 符 号 。 有 关 详 细 信 息 参 见 第 4 章 “ 表 达式 和 赋 值 ”。
语 言 符 号
在 C 源 程 序 中 , 编 译 器 识 别 的 基 本 元 素 是 “ 语 言 符 号 ” ,一 个 语 言 符 号 是编 译 器 不 能 分 成 组 成 成 分 元 素 的 源 程 序 文 本 。
语 法
语 言 符 号 :
关 键 词标 识 符常 量
字 符 串 文 字运 算 符
标 点 字 符
注 意 : 有 关 ANSI 语 言 规 定 的 解 释 , 参 见 本 卷 后 面 附 录 A“ C 语 言 语 法 总 结 ” 的 引 言 部 分 。
在 本 章 中 描 述 的 关 键 词 、 标 识 符 、 常 量 、 字 符 串 文 字 和 运 算 符 都 是 语 言符 号 的 例 子 。 标 点 字 符 和 中 括 号 ([])、 花 括 号 ({})、 圆 括 号 (()) 和 逗 号 (,) 也 是 语 言 符 号 。
空 白 字 符
空 格 、 制 表 、 换 行 、 回 车 、 换 页 、 纵 向 制 表 (vertical tab)和 换 行 (newline)
字 符 都 称 为 空 白 字 符 (white-space), 因 为 它 们 具 有 相 同 的 功 能 , 即 作 为 打 印
页 上 单 词 和 行 之 间 的 空 白 , 使 其 更 容 易 阅 读 。 通 过 空 白 字 符 和 其 它 语 言符 号 , 例 如 运 算 符 和 标 点 , 从 而 对 语 言 符 号 进 行 定 界 。 当 对 代 码 进 行 词法 分 析 时 ,C 编 译 器 忽 略 空 白 字 符 , 除 非 使 用 它 们 作 为 分 隔 符 或 者 字 符 常量 或 字 符 串 文 字 的 组 成 成 分 。 使 用 空 白 字 符 使 程 序 更 具 可 读 性 。 注 意 编译 器 也 把 注 释 作 为 空 白 字 符 处 理 。
注 释
一 个 “ 注 释 ” 是 以 正 向 斜 线 / 星 号 的 组 合 (/*)( 编 译 器 处 理 作 为 单 个 空 白 字符 , 其 它 忽 略 ) 开 头 的 字 符 序 列 。 一 个 注 释 可 以 包 含 可 表 示 字 符 集 的 字 符的 任 何 组 合 , 包 括 换 行 字 符 , 但 不 能 有 “ 结 束 注 释 ” 定 界 符 (*/) 。 注 释 可 以多 于 一 行 但 不 能 嵌 套 。
注 释 可 以 出 现 在 一 个 空 白 字 符 允 许 出 现 的 任 何 地 方 , 由 于 编 译 器 把 一 个注 释 作 为 一 个 空 白 字 符 处 理 , 你 不 能 在 语 言 符 号 中 包 含 注 释 , 编 译 器 忽 略注 释 中 的 字 符 。
使 用 注 释 文 档 化 你 的 代 码 , 这 个 例 子 是 编 译 器 接 受 的 一 个 注 释 :
/* Comments can contain keywords such as for and while without generating errors. */
注 释 可 以 与 一 个 代 码 语 句 出 现 在 同 一 行 :
printf("Hello\n"); /* Comments can go here */
你 可 以 在 函 数 或 程 序 模 块 之 前 选 择 一 个 描 述 性 的 注 释 块 :
/* MATHERR.C illustrates writing an error routine
* for math functions.
*/
既 然 注 释 不 能 包 含 嵌 套 的 注 释 ,这 个 例 子 导 致 一 个 错 误 :
/* Comment out this routine for testing
/* Open file */ fh=_open("myfile.c",_O_RDONLY);
.
.
.
*/
这 个 错 误 出 现 是 因 为 编 译 器 识 别 第 一 个 */, 单 词 Open file 之 后 作 为 注 释结 束 , 它 处 理 余 下 的 文 本 , 在 发 现 注 释 外 面 的 * /时 产 生 一 个 错 误 。
当 你 使 用 注 释 表 示 某 些 代 码 行 为 了 测 试 而 不 激 活 时 , 预 处 理 器 命 令 #if 和#endif 以 及 条 件 编 译 是 另 一 种 有 用 的 方 法 。 有 关 详 细 信 息 参 见 本 卷 后 面“ 预 处 理 器 参 考 ” 中 的 “ 预 处 理 器 命 令 ”。
Microsoft 特 殊 处 →
Microsoft 编 译 器 还 支 持 以 两 个 正 向 斜 线 (//) 开 头 的 单 行 注 释 。 如 果 你 用
/Za(ANSI 标 准 ) 编 译 , 这 些 注 释 产 生 错 误 , 另 外 这 些 注 释 不 能 超 过 第 二 行 。
// This is a valid comment
注 释 以 两 个 正 向 斜 线 (//) 开 头 , 以 下 一 个 换 行 字 符 结 束 , 不 能 在 前 加 上 一 个转 义 字 符 。 在 下 面 的 例 子 中 , 换 行 符 有 一 个 反 向 斜 线 (\), 建 立 一 个 “ 转 义序 列 ”。 这 个 转 义 序 列 导 致 编 译 器 把 下 一 行 作 为 前 面 行 的 一 部 分 进 行 处理 (有 关 详 细 信 息 , 参 见 本 章 后 面 的 “ 转 义 序 列 ” )。
// my comment \
i++;
因 此 ,i++ ;语 句 被 注 释 了 。
Microsoft C 缺 省 是 启 用 M icrosoft 扩 充 的 。 使 用 /Za 关 闭 这 些 扩 充 。
Microsoft 特 殊 处 结 束语 言 符 号 的 求 值
当 编 译 器 解 释 语 言 符 号 时 , 它 在 移 到 下 一 个 语 言 符 号 之 前 在 单 个 语 言 符号 中 包 含 尽 可 能 多 的 字 符 。 因 为 这 种 行 为 , 编 译 器 不 可 能 在 不 用 空 白 的字 符 分 隔 它 们 时 来 解 释 语 言 符 号 ,对 于 如 下 表 达 式 :
i+++j
在 这 个 例 子 中 , 编 译 器 首 先 从 三 个 加 号 中 产 生 最 长 可 能 的 运 算 符 (++), 然后 处 理 余 下 的 加 号 作 为 一 个 加 法 运 算 符 (+) 。 因 此 , 该 表 达 式 解 释 为(i++)+(j), 而 不 是 (i)+(++j) 。 在 这 个 类 似 的 情 况 下 , 使 用 空 白 和 括 号 避 免 模糊 性 , 并 确 保 正 确 的 表 达 式 计 算 。
Microsoft 特 殊 处 →
C 编 译 器 处 理 CTRL+Z 字 符 为 一 个 文 件 结 尾 指 示 器 ,它 忽 略 CTRL+Z 之后 的 任 何 文 本 。
Microsoft 特 殊 处 结 束
关 键 词
关 键 词 是 C 编 译 器 中 具 有 特 定 意 义 的 单 词 。 在 翻 译 阶 段 7 和 8, 一 个 标识 符 不 能 和 C 关 键 词 具 有 相 同 的 拼 写 和 大 小 写 ( 参 见 本 卷 后 面 “ 预 处 理器 参 考 ” 中 的 转 换 阶 段 的 描 述 ; 有 关 标 识 符 的 信 息 , 参 见 下 一 节 “ 标 识符 ” )。 C 语 言 使 用 如 下 关 键 词 :
auto |
double |
int |
struct |
---|---|---|---|
break |
else |
long |
switch |
case |
enum |
register |
typedef |
char |
extern |
return |
union |
const |
float |
short |
unsigned |
continue |
for |
signed |
void |
default |
goto |
sizeof |
volatile |
do |
if |
static |
while |
你 不 能 重 新 定 义 关 键 词 , 但 你 可 以 使 用 C 预 处 理 器 命 令 在 编 译 之 前 指 定用 于 替 换 关 键 词 的 文 本 。
Microsoft 特 殊 处 →
ANSI C 标 准 允 许 用 两 个 下 划 线 引 导 的 标 识 符 作 为 编 译 执 行 的 保 留 字 。因 此 ,Microsoft 约定 M icrosoft 的 指 定 关 键 词 之 前 带 两 个 下 划 线 。 这 些 词不 能 用 作 标 识 符 名 称 。 对 于 ANSI 命 名 标 识 符 的 描 述 , 包 括 双 下 划 线 的 使用 ,参 见 下 一 节 “ 标 识 符 ”。
Microsoft C 编 译 器 识 别 的 关 键 词 和 指 定 标 识 符 如 下 :
__
-
__ based 关键词限制用于 32 位目标编译。
-
这些是与 __ declspec 一起使用时指定的标识符 , 它们用在其它上下文中没有限制。
缺 省 地 Microsoft 扩 充 是 允 许 的 ,为 了 确 保 你 的 程 序 是 完 整 可 移 植 的 ,你 在编 译 时 指 定 /Za 选项 (ANSI 兼 容 的 编 译 ) 来 关 闭 M icrosoft 扩 充 。 当 你 这样 做 后 ,Microsoft 特 定 关 键 词 是 禁 止 的 。
当 允 许 M icrosoft 扩 充 时 ,你 可 以 在 程 序 中 使 用 上 面 所 列 的 关 键 词 。 为 了与 ANSI 一 致 ,这 些 大 多 数 关 键 词 加 上 了 一 个 双 下 划 线 前 缀 。 但 有 四 个 例外 ,即 dllexport, dllimport, naked 和 thread, 仅与 __declspc 一 起 使 用 , 因 此不 需 要 引 导 的 两 个 下 划 线 。 为 了 向 后 兼 容 , 也 支 持 余 下 的 关 键 字 的 一 个下 划 线 引 导 的 版 本 。
Microsoft 特 殊 处 结 束
标 识 符
“ 标 识 符 ” 或 “ 符 号 ” 是 你 的 程 序 中 提 供 的 变 量 、 类 型 、 函 数 和 标 号 的名 称 。 标 识 符 在 拼 写 和 大 小 写 上 必 须 不 同 于 关 键 词 。 你 不 能 使 用 关 键 词(C 或 M icrosoft) 作 为 标 识 符 ,它 们 为 了 特 定 用 途 而 被 保 留 。 你 可 以 通 过 在
变 量 、 类 型 或 函 数 的 说 明 中 指 定 它 来 建 立 一 个 标 识 符 。 在 以 下 例 子中 ,result 是 一 个 整 数 变 量 的 标 识 符 , 而 main 和 printf 是 函 数 的 标 识 符 名称 :
void main()
{
int result;
if (result!=0)
printf("Bad file handle\n");
}
-
旦 说 明 ,你 可 以 在 后 面 的 程 序 语 句 中 使 用 该 标 识 符 引
用 关 联 的 值 。
-
种 特 定 类 型 的 标 识 符 , 称 为 语 句 标 号 , 它 可 以 用 在 goto 语 句 中 ( 其 说 明在 第 3 章 “ 说 明 和 类 型 ” 中 描 述 。 语 句 标 号 在 第 5 章 “ 语 句 ” 的 “ goto 和 标 号 语 句 ” 中 描 述 )。
语 法
标 识 符 :
非 数 字
标 识 符 非 数 字标 识 符 数字
非 数 字 :如 下 之 一 :
_ a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
数 字 :如 下 之 一 :
0 1 2 3 4 5 6 7 8 9
- 个 标 识 符 名 称 的 第 一 个 字 符 必 须 是 非 数 字 ( 也 就 是 , 第 一 个 字 符 必 须 是一 个 下 划 线 或 者 一 个 大 写 或 小 写 字 母 )。 ANSI 允 许 一 个 外 部 标 识 符 的 名称 中 有 6 个 有 效 字 符 , 在 一 个 内 部 标 识 符 ( 一 个 函 数 中 ) 的 名 称 中 允 许 有 31 个 字 符 。 外 部 标 识 符 ( 以 全 局 范 围 说 明 或 用 存 储 类 extern 说 明 ) 要 服 从 另外 的 命 名 限 制 , 因 为 这 些 标 识 符 可 以 被 其 它 软 件 例 如 链 接 器 处 理 。Microsoft 特 殊 处 →
虽 然 ANSI 允 许 外 部 标 识 符 名 称 中 有 6 个 有 效 字 符 , 允 许 内 部 标 识 符 ( 一个 函 数 中 ) 中 有 31 个 字 符 , 但 M icrosoft C 编 译 器 允 许 一 个 内 部 或 外 部 标识 符 名 称 中 有 247 个 字 符 。 如 果 不 关 心 与 ANSI 的 兼 容 性 ,你 可 以 使 用 /H 选 项 ( 限 制 外 部 名 称 的 长 度 ) 修 改 这 个 缺 省 值 为 一 个 较 小 或 较 大 的 值 。Microsoft 特 殊 处 结 束
C 编 译 器 把 大 写 和 小 写 字 母 当 作 不 同 的 字 符 。 这 个 特 征 称 为 “ 大 小 写 敏感 的 ” , 允 许 你 建 立 具 有 相 同 的 拼 写 但 有 一 个 或 多 个 不 同 的 大 小 写 的 不同 的 标 识 符 。 例 如 , 下 面 每 个 标 识 符 都 是 唯 一 的 :
add ADD
Add aDD
Microsoft 特 殊 处 →
不 要 为 标 识 符 选 择 以 两 个 下 划 线 开 头 或 以 一 个 下 划 线 加 上 一 个 大 写 字 母
开 头 的 名 称 。 ANSI C 标 准 允 许 以 这 些 字 符 组 合 开 头 的 标 识 符 名 称 保 留为 编 译 器 使 用 。 文 件 层 范 围 的 标 识 符 也 不 要 以 一 个 下 划 线 加 上 一 个 小 写字 母 开 头 来 命 名 。 以 这 些 字 符 开 头 的 标 识 符 也 是 保 留 的 。 M icrosoft 约定 使 用 一 个 下 划 线 和 一 个 大 写 字 母 开 头 的 宏 名 称 以 及 两 个 下 划 线 开 头 的Microsoft 特 定 关 键 字 名 称 。 为 了 避 免 任 何 命 名 冲 突 , 总 是 选 择 不 以 一 个或 两 个 下 划 线 开 头 的 名 称 , 或 者 以 一 个 下 划 线 加 上 一 个 大 写 字 母 开 头 的名 称 。
Microsoft 特 殊 处 结 束
下 面 的 例 子 是 满 足 ANSI 和 M icrosoft 命 名 限 制 的 有 效 标 识 符 :
j count temp1
top_of_page skip12 LastNum
Microsoft 特 殊 处 →
虽 然 源 文 件 中 的 标 识 符 缺 省 是 大 小 写 敏 感 的 , 但 目 标 文 件 中 的 符 号 却 不是 。 M icrosoft C 在 一 个 编 译 单 元 中 处 理 标 识 符 为 大 小 写 敏 感 的 。Microsoft 链 接 器 是 大 小 写 敏 感 的 , 你 必 须 根 据 大 小 写 一 致 性 地 指 定 所 有标 识 符 。
“ 源 字 符 集 ” 是 可 以 在 源 文 件 中 出 现 的 合 法 字 符 集 。 对 于 Microsoft C,
源 字 符 集 是 标 准 ASCII 字 符 集 。 包 括 ASCII 字 符 的 源 字 符 集 和 执 行 字
符 集 用 作 转 义 序 列 。 有 关 执 行 字 符 集 的 信 息 参 见 本 章 后 面 的 “ 字 符 常量 ” 。
Microsoft 特 殊 处 结 束
- 个 标 识 符 具 有 “ 范 围 ” , 它 是 指 被 程 序 已 知 的 和 “ 连 接 ” 的 程 序 范 围 , 该 “ 连 接 ” 确 定 另 一 个 范 围 内 同 名 称 标 识 符 是 否 是 同 一 个 标 识 符 。 这 些主 题 在 第 2 章 “ 程 序 结 构 ” 中 的 “ 生 存 期 、 范 围 、 可 见 性 和 连 接 ” 中 解释 。
多 字 节 和 宽 字 符
- 个 多 字 节 字 符 是 由 一 个 或 多 个 字 节 序 列 组 成 的 一 个 字 符 。 每 个 字 节 序列 表 示 扩 展 字 符 集 中 的 单 个 字 符 。 多 字 节 字 符 用 在 字 符 串 例 如 汉 字 中 。宽 字 符 是 总 为 16 位 宽 的 多 种 语 言 字 符 代 码 。 字 符 常 量 的 类 型 是 char, 对于 宽 字 符 ,其 类 型 为 wchar_ t。 既 然 宽 字 符 总 是 固 定 的 长 度 ,使 用 宽 字 符 可以 简 化 使 用 国 际 字 符 集 的 程 序 设 计 。
宽 字 符 串 文 字 L"hello" 变 成 一 个 类 型 wchar_t 的 6 个 整 数 的 数 组 :
{L ’h ’ ,L ’ e ’,L ’ l ’,L ’ l ’ ,L ’o ’,0}
单 代 码 (Unicode) 规 格 是 宽 字 符 的 规 格 。 多 字 节 和 宽 字 符 之 间 进 行 转 换 的运 行 库 例 程 包 括 mbstowcs 、 mbtow c、 wcstombs 和 wctom b。
三 字 母
C 源 程 序 的 源 字 符 集 被 包 含 在 7 位 ASCII 字 符 集 中 , 但 不 是 ISO 646-1983
Invariant Code Set 的 子 集 。三 字 母 (trigraph )序 列 允 许 C 程 序 仅 使 用 ISO (国际 标 准 组 织 ) Invariant Code Set 编 写 。 三 字 母 是 编 译 器 用 对 应 的 标 点 字符 替 换 的 三 字 符 序 列 ( 以 两 个 问 号 开 头 )。 你 可 以 在 C 源 文 件 中 使 用 三 字母 ,该 源 文 件 的 字 符 集 不 能 包 含 某 些 标 点 字 符 的 方 便 图 形 表 示 。
表 1.1 给 出 了 9 个 三 字 母 序 列 。 所 有 源 文 件 中 出 现 的 第 一 行 的 标 点 字 符都 被 第 2 列 中 对 应 的 字 符 所 替 换 。
表 1.1 三 字 母 序 列
三字母 |
标点字符 |
---|---|
??= |
# |
??( |
[ |
??/ |
\ |
??) |
] |
??' |
^ |
??< |
{ |
??! |
| |
??> |
} |
??- |
~ |
一 个 三 字 母 总 是 作 为 单 个 源 字 符 处 理 , 在 第 一 次 转 换 阶 段 中 , 在 识 别 字 符串 文 字 和 字 符 常 量 中 的 转 义 字 符 之 前 进 行 三 字 母 的 转 换 。 仅 识 别 表 1.1 中 列 出 的 9 个 三 字 母 ,所 有 其 它 字 符 序 列 不 作 转 换 。
字 符 转 义 序 别 \? 防 止 类 似 三 字 母 的 字 符 序 列 被 误 解 释 ( 有 关 转 义 序 列 的 信
息 ,参 见 本 章 后 面 的 “ 转 义 序 列 ” )。 例 如 ,如 果 你 试 图 用 以 下 printf 语 句打 印 字 符 串 What??!:
printf( “ What??!\n");
打 印 的 字 符 串 What|, 因 为 ?? ! 是 一 个 三 字 母 , 它 被 |字 符 所 替 换 。 正 确 打印 这 个 字 符 串 的 语 句 如 下 :
printf(What?\?!\n");
在 这 个 printf 语 句 中 , 在 第 二 个 问 号 之 前 加 上 一 个 反 斜 杠 转 义 字 符 防止 ?? ! 作 为 一 个 三 字 母 的 误 解 释 。
常 量
一 个 “ 常 量 ” 是 一 个 可 以 在 程 序 中 作 为 值 的 一 个 数 、 字 符 ,或 者 字 符 串 。使 用 常 量 表 示 不 能 修 改 的 浮 点 数 、 整 数 、 枚 举 或 字 符 值 。
语 法
常 量 :
浮 点 常 量整 数 常 量枚 举 常 量字 符 常 量
常 量 通 过 具 有 一 个 值 和 一 个 类 型 来 描 述 。 浮 点 数 、 整 数 和 字 符 常 量 在 下面 三 个 小 节 讨 论 。 枚 举 常 量 在 第 3 章 “ 说 明 和 类 型 ” 的 “ 枚 举 说 明 ” 中描 述 。
浮 点 数 常 量
一 个 “ 浮 点 数 常 量 ” 是 一 个 表 示 带 符 号 实 数 的 十 进 制 数 。 带 符 号 实 数 的表 示 包 括 一 个 整 数 部 分 、 一 个 小 数 部 分 和 一 个 指 数 。 使 用 浮 点 常 量 表 示不 能 改 变 的 浮 点 值 。
语 法
浮 点 常 量 :
分 数 常 量 指 数 部 分 opt 浮 点 后 缀 opt
数 字 序 列 指 数 部 分 浮 点 后 缀 opt
分 数 常 量 :
数 字 序 列 opt.数 字 序 列数 字 序 列 .
指 数 部 分 :
e 符 号 opt 数 字 序 列
E 符 号 opt 数 字 序 列符 号 : 如 下 之 一
+ -
数 字 序 列 :
数 字
数 字 序 列 数 字浮 点 后 缀 :如 下 之 一
f l F L
你 可 以 省 略 小 数 点 之 前 的 数 字 ( 该 值 的 整 数 部 分 ), 或 小 数 点 之 后 的 数 字 ( 小 数 部 分 ),但 不 能 都 省 略 。 仅 当 你 包 括 一 个 指 数 时 才 可 以 省 去 小 数 点 。常 量 的 数 字 和 字 符 之 间 不 需 要 空 白 字 符 分 隔 。
如 下 例 子 说 明 了 几 种 浮 点 常 量 和 表 达 式 的 格 式 :
15.75
1.575 E1 /*=15.75*/
1575e-2 /*=15.75*/
-2.5e-3 /*=-0.0025*/ 25E-4 /*=0.0025*/
浮 点 常 量 除 非 前 面 加 有 一 个 负 号 (-), 否 则 是 一 个 正 数 。 在 这 种 情 况 下 , 负
号 作 为 单 目 算 术 取 反 运 算 符 处 理 。 浮 点 常 量 具 有 类 型 floa t、double 、long
或 long double 。
一 个 没 有 f、 F 、 l 或 L 后 缀 的 浮 点 常 量 具 有 类 型 double 。 如 果 有 f 或 F 后 缀 , 该 常 量 的 类 型 为 float; 如 果 有 字 母 l 或 L 后 缀 ,其 类 型 为 long double 。例 如 :
100L /* 有类型 long double*/ 100F /* 有 类 型 float*/
100D /* 有类型 double*/
注 意 ,M icrosoft C 编 译 器 把 long double 映 射 成 类 型 double 。有 关 double 、float 和 long 类 型 的 信 息 参 见 第 3 章 “ 说 明 和 类 型 ” 中 的 “ 基 本 类 型 存储 ” 。
你 可 以 省 略 浮 点 常 量 的 整 数 部 分 ,如 以 下 例 子 所 示 ,数 值 .75 可 以 采 用 多 种
方 式 表 示 ,包 括 如 下 :
.0075e2 0.075e1
.075e1 75e-2
浮 点 常 量 的 限 制
Microsoft 特 殊 处 →
表 1.2 中 给 出 了 浮 点 常 量 值 的 限 制 , 头 文 件 FLOAT.H 包 含 这 些 信 息 。
表 1.2 浮 点 常 量 的 限 制
常量 |
含义 |
值 |
||||||||
---|---|---|---|---|---|---|---|---|---|---|
FLT_DIG |
q 个数字的数值 ,有 q 个十进制 |
6 |
||||||||
DBL_DIG |
数字的浮点数可以舍入成一个 |
15 |
||||||||
LDBL_DIG |
浮点表示 , 回过来时不丢失精度 |
15 |
||||||||
FLT_EPSILON |
最小正数 x ,并且 x+1.0 不等于 1.0 |
1.192092896e-07F |
||||||||
DBL_EPSILON |
2.2204460492503131e- |
|||||||||
016 |
||||||||||
LDBL_EPSILON |
2.2204460492503131e- |
|||||||||
016 |
||||||||||
FLT_GUARD |
0 |
|||||||||
FLT_MANT_DIG |
在 |
浮 |
点 |
有 |
效 |
数 |
字 |
中 |
以 |
24 |
FLT_RADIX 指
续 表
DBL_MANT_DIG |
定基数的数字的数值。该基数为 2; |
53 |
---|---|---|
LDBL_MANT_DI |
因此这些值指定位 |
53 |
G |
||
FLT_MAX |
最大可表示的浮点数 |
3.402823466e+38F |
DBL_MAX |
1.7976931348623158e+3 |
|
08 |
||
LDBL_MAX |
1.7976931348623158e+3 |
|
08 |
||
FLT_MAX_10_E X P DBL_MAX_10_E |
最 大 整 数 ,10 的 这 个 数 的 乘 方 是一 个可表示的浮点数 |
38 308 |
X P |
||
LDBL_MAX_10_ |
308 |
|
EXP FLT_MAX_EXP |
最大整数 ,FLT_RADIX 的这个数 |
128 |
DBL_MAX_EXP |
的乘 方是一个可表示的浮点数 |
1024 |
LDBL_MAX_EXP |
1024 |
|
FLT_MIN |
最小正数 |
1.175494351-38F |
DBL_MIN |
2.2250738585072014e- |
|
308 |
||
LDBL_MIN |
2.2250738585072014e- |
|
308 |
FLT_MIN_10_EX P DBL_MIN_10_EX P LDBL_MIN_10_E X P
续 表
最小负整数 ,10 的这个数 -37
的乘方是一个可表示的浮 -307
点数 -307
FLT_MIN_EXP 最小负整数 ,FLT_RADIX- 125
DBL_MIN_EXP 的这个数的乘方是一个可表 - 1021
LDBL_MIN_EXP 示的浮点数 -1021
FLT_NORMALIZ 0
E
FLT_RADIX 指数表示的基数 2
_DBL_RADIX 2
_LDBL_RADIX 2
FLT_ROUNDS 浮点加法的舍入 1( 近 )
_DBL_ROUNDS 模式 1( 近 )
_LDBL_ROUNDS 1( 近 )
注意 :表 1.2 中的信息可能在将来有不同的实现。
Microsoft 特 殊 处 结 束整 数 常 量
- “ 整 数 常 量 ” 是 表 示 一 个 整 数 值 的 十 进 制 ( 基 数 为 10)
、 八 进 制 ( 基 数
为 8) 或 十 六 进 制 ( 基 数 为 16) 的 数 。 使 用 整 数 常 量 表 示 不 能 改 变 的 整 数值 。
语 法
整 数 常 量 :
十 进 制 常 量 整 数 后 缀 opt
八 进 制 常 量 整 数 后 缀 opt
十 六 进 制 常 量 整 数 后 缀 opt
十 进 制 常 量 :
非 0 数 字
十 进 制 常 量 数 字八 进 制 常 量 :
0
八 进 制 常 量 八 进 制 数 字十 六 进 制 常 量 :
0x 十 六 进 制 数 字
0X 十 六 进 制 数 字
十 六 进 制 常 量 十 六 进 制 数 字非 0 数 字 :如 下 之 一
1 2 3 4 5 6 7 8 9
八 进 制 数 字 :如 下 之 一
0 1 2 3 4 5 6 7
十 六 进 制 数 字 : 如 下 之 一
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
整 数 后 缀 :
无 符 号 后 缀 长 整 数 后 缀 opt
长 整 数 后 缀 无 符 号 后 缀 opt
无 符 号 后 缀 :如 下 之 一
u U
长 整 数 后 缀 :如 下 之 一
l L
64 位 整 数 后 缀 :
i64
除 非 整 数 常 量 前 面 有 负 号 (-), 否 则 是 正 数 。 负 号 被 解 释 为 单 目 算 术 取 反运 算 符 ( 有 关 这 个 运 算 的 信 息 , 参 见 第 4 章 “ 表 达 式 和 赋 值 ” 中 的 “ 单 目算 术 运 算 符 ” )。
如 果 一 个 整 数 常 量 以 0x 或 0X 字 母 开 头 ,则 它 是 十 六 进 制 的 ;如 果 以 数 字
0 开 头 ,则 为 八 进 制 数 ;否 则 ,它 假 设 为 十 进 制 数 。下 面 两 行 是 等 价 的 :
0x1C /* 十进制数 28 的十六进制表示 */
034/* 十进制数 28 的八进制表示 */
- 个 整 数 常 量 的 数 字 之 间 不 能 用 空 白 字 符 分 开 。 以 下 例 子 是 有 效 的 十 进制 、 八 进 制 和 十 六 进 制 常 量 :
/* 十进制常量 */ 10
132
32179
/* 八进制常量 */ 012
0204
076663
/* 十六进制常量 */ 0xa 或 0xA
0x84
0x7dB3 或 0x7DB3
整 数 类 型
每 个 整 数 常 量 基 于 它 的 值 和 表 示 方 式 被 给 定 一 个 类 型 。 你 可 以 通 过 在 常量 的 末 尾 添 加 字 母 l 或 L 来 强 制 任 何 整 数 常 量 为 long 类 型 。 通 过 添 加 u 或 U 来 强 制 它 为 unsigned 类 型 。 小 写 字 母 l 可 能 与 数 字 1 混淆 , 应 避 免这 样 。 几 个 long 整 数 常 量 的 格 式 如 下 :
/* 长十进制常量 */ 10L
79L
/* 长八进制常量 */ 012L
0115L
/* 长十六进制常量 */ 0xaL 或 0xAL 0X4fL 或 0x4FL
/* 无符号长十进制常量 */ 776745UL
778866LU
你 赋 给 一 个 常 量 的 类 型 依 赖 于 该 常 量 表 示 的 值 。 一 个 常 量 的 值 必 须 在 其类 型 可 表 示 的 值 的 范 围 内 , 一 个 常 量 的 类 型 确 定 了 当 该 常 量 用 于 一 个 表达 式 或 应 用 一 个 负 号 (-) 时 执 行 的 转 换 。这 里 列 出 了 整 数 常 量 的 转 换 规 则 :
-
没 有 后 缀 的 十 进 制 常 量 的 类 型 有 int、 long int 或 unsigned long int 。在 该 常 量 的 值 可 以 表 示 的 三 种 类 型 中 第 一 种 类 型 作 为 赋 给 该 常 量 的类 型 。
-
没 有 后 缀 的 八 进 制 和 十 六 进 制 常 量 赋 给 的 类 型 根 据 常 量 的 大 小 可 以是 in t 、 unsigned in t 、 long int 或 unsigned long in t 。
-
带 u 或 U 后 缀 的 常 量 赋 给 的 类 型 根 据 它 们 的 大 小 可 以 是 unsigned int
或 unsigned long int 。
- 带 l 或 L 后 缀 的 常 量 赋 给 的 类 型 根 据 它 们 的 尺 寸 可 以 是 long int 或
unsigned long in t 。
- 带 u 或 U 和 l 或 L 后 缀 的 常 量 赋 给 的 类 型 是 unsigned long in t 。
整 数 限 制
Microsoft 特 殊 处 →
表 1.3 列 出 了 整 数 类 型 的 限 制 , 这 些 限 制 定 义 在 标 准 头 文 件 LIMITS.H
中 。
Microsoft C 还 允 许 说 明 可 变 大 小 的 整 数 变 量 , 可 以 是 大 小 为 8 位、 16 位或 32 位 的 整 数 类 型 ,有 关 可 变 大 小 整 数 的 信 息 , 参 见 第 3 章“ 说 明 和 类 型 ” 中 的 “ 可 变 大 小 整 数 类 型 ”。
表 1.3 |
整 数 常 量 的 限 制 |
||
---|---|---|---|
常量 |
含义 |
值 |
|
CHAR_BIT |
不 是 一 个 位 域 的 最 小 变 量 中 的 位 |
8 |
|
数 |
|||
SCHAR_MIN |
类型 signed char 的变量的最小值 |
-128 |
|
SCHAR_MAX UCHAR_MAX |
类型 signed char 的变量的最大值 类型 unsigned char 的 变 量 的 最 大 |
127 225(0xff) |
|
CHAR_MIN |
值 类型 char 的变量的最小值 |
-128 ;如果使用 /J |
选项则 |
为 0 |
|||
CHAR_MAX |
类型 char 的变量的最大值 |
127; 如 果 使 用 /J |
选 项 则 |
为 255 |
MB_LEN_MAX 多字符常量中的最大字节数 2
SHRT_MIN 类型 short 的变量的最小值 -32768 SHRT_MAX 类型 short 的变量的最大值 32767
USHRT_MAX 类型 unsigned short 的 变 量 的 最 大
值
65535(0xffff)
INT_MIN 类型 int 的变量的最小值 -2147483647-1 INT_MAX 类型 int 的变量的最大值 2147483647
UINT_MAX 类型 unsigned int 的变量的最大值 4294967295(0xffffffff) LONG_MIN 类型 long 的变量的最小值 -2147483647-1
续 表
LONG_MAX 类型 long 的变量的最大值 2147483647
ULONG_MAX 类型 unsigned long 的 变 量 的 最 大
值
4294967295(0xffffffff)
如 果 一 个 值 超 过 了 最 大 整 数 表 示 ,M icrosoft 编 译 器 产 生 一 个 错 误 。
Microsoft 特 殊 处 结 束字 符 常 量
一 个 “ 字 符 常 量 ” 是 由 可 表 示 字 符 集 中 单 个 字 符 由 单 引 号 (′ ′ ) 括 起 来构 成 的 。 字 符 常 量 可 用 来 表 示 执 行 字 符 集 中 的 字 符 。
语 法
字 符 常 量 :
′ c 字 符 序 列 ′
L ′ c 字 符 序 列 ′
c 字 符 序 列 :
c 字 符
c 字 符 序 列 c 字符
c 字 符
源 字 符 集 中 除 单 引 号 (′ )、 反 向 斜 杠 (\) 或 换 行 符 之 外 的 任 何 成 员 。转 义 序 列
转 义 序 列 :
简 单 转 义 序 列
八 进 制 转 义 序 列十 六 进 制 转 义 序 列
简 单 转 义 序 列 : 如 下 之 一 :
\a \b \f \n \r \t \ v
\' \" \\ \?
八 进 制 转 义 序 列 :
\ 八 进 制 数 字
\ 八 进 制 数 字 八 进 制 数 字
\ 八 进 制 数 字 八 进 制 数 字 八 进 制 数 字十 六 进 制 转 义 序 列 :
\x 十 六 进 制 数 字
十 六 进 制 转 义 序 列 十 六 进 制 数 字
字 符 类 型
一 个 整 数 字 符 常 量 不 以 字 母 L 开 头 并 具 有 int 类 型 。 一 个 包 含 单 个 字 符的 整 数 字 符 常 量 的 值 是 作 为 一 个 整 数 解 释 的 字 符 的 数 值 。 例 如 , 字 符 a 的 数 值 是 十 进 制 97 和 十 六 进 制 61 。
从 语 法 上 看 ,一 个 “ 宽 字 符 常 量 ” 是 一 个 带 前 缀 字 母 L 的 字 符 常 量 。 一个 宽 字 符 常 量 有 类 型 wchar_t, 一 个 整 数 类 型 定 义 在 STDDEF.H 头 文 件 中 , 例 如 :
charschar= ′ x ′ ; /* 一个字符常量 */
wchar_t wchar=L ′ x ′ ;/* 一个同样字符的宽字符常量 */
宽 字 符 常 量 有 16 位 宽 ,指 出 扩 充 的 执 行 字 符 集 的 成 员 。 它 们 允 许 你 采 用因 太 大 不 能 由 类 型 char 表 示 的 字 母 表 示 字 符 。 有 关 宽 字 符 的 更 多 信 息 , 参 见 本 章 前 面 的 “ 多 字 节 和 宽 字 符 ”。
执 行 字 符 集
本 书 经 常 提 到 “ 执 行 字 符 集 ”。 执 行 字 符 集 不 必 与 编 写 C 程 序 使 用 的 源字 符 集 完 全 相 同 , 执 行 字 符 集 包 括 源 字 符 集 中 所 有 字 符 以 及 空 字 符 、 换行 符 、 回 退 符 、 水 平 制 表 、 垂 直 制 表 、 回 车 和 转 义 序 列 。 源 字 符 集 和 执行 字 符 集 在 其 它 实 现 上 可 能 不 同 。
转 义 序 列
由 一 个 反 向 斜 杠 (\) 后 跟 一 个 字 母 或 一 个 数 字 构 成 的 字 符 组 合 称 之 为 “ 转义 序 列 ”。 为 了 表 示 换 行 符 、 单 引 号 或 某 些 其 它 字 符 常 量 ,你 必 须 使 用 转义 序 列 。 一 个 转 义 序 列 作 为 单 个 字 符 , 因 此 是 一 个 有 效 的 字 符 常 量 。
转 义 序 列 一 般 用 于 指 出 动 作 , 如 在 终 端 和 打 印 机 上 的 回 车 和 制 表 移 动 , 它 们 也 用 来 提 供 非 打 印 字 符 和 有 特 定 意 义 的 字 符 , 如 双 引 号 的 文 字 表示 。 表 1.4 列 出 了 ANSI 转 义 序 列 及 其 表 示 。
注 意 , 反 向 斜 杠 之 后 加 一 个 问 号 (\?) 指 出 一 个 文 字 问 号 , 在 这 种 情 况 中 , 该字 符 序 列 可 能 误 解 释 为 一 个 三 字 母 ,有 关 更 多 的 信 息 ,参 见 本 章 前 面 的“ 三字 母 ”。
表 1.4 转 义 序 列
转义序列 表示
\a 响铃 (警告 )
\b 回退
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\′ 单引号
\" 双引号
\\ 反向斜杠
\? 文字问号
\ooo 八进制表示的 ASCII 字符
\xhhh 十六进制表示的 ASCII 字符
Microsoft 特 殊 处 →
如 果 一 个 字 符 之 前 的 反 向 斜 杠 不 出 现 在 表 1.4 中 ,编 译 器 处 理 该 无 定 义 的字 符 为 该 字 符 本 身 , 例如 ,\x 作 为 一 个 x 处 理 。
Microsoft 特 殊 处 结 束
转 义 序 列 允 许 你 把 非 图 形 控 制 字 符 传 送 给 一 个 显 示 设 备 , 例 如 ,ESC 字 符
(\033) 经 常 用 作 一 个 终 端 或 打 印 机 的 控 制 命 令 的 第 一 个 字 符 。 有 些 转 义序 列 是 设 备 特 定 的 。 例 如 , 垂 直 制 表 和 换 页 转 义 序 列 (\v 和 \f) 不 能 用 于 屏幕 输 出 , 而 它 们 执 行 适 当 的 打 印 机 操 作 。
你 可 以 使 用 反 斜 杠 (\) 作 为 一 个 续 行 符 ,当 一 个 换 行 符 ( 等 价 于 按 RETURN) 后 立 即 跟 一 个 反 斜 杠 (\), 编 译 器 便 忽 略 该 反 斜 杠 和 换 行 符 , 把 下 一 行 作 为前 面 一 行 的 一 部 分 。 这 主 要 用 于 超 过 一 行 的 预 处 理 定 义 ,例 如 :
#define assert(exp) \
((exp) ? (void) 0:_assert(#exp,_ _FILE_ _,_ _LINE_ _))
八 进 制 和 十 六 进 制 字 符 规 格
序 列 \ooo 表 示 你 可 以 以 一 个 三 数 字 八 进 制 字 符 代 码 指 定 ASCII 字 符 集中 的 任 何 字 符 , 该 八 进 制 整 数 的 数 值 指 定 期 待 的 字 符 或 宽 字 符 的 值 。
类 似 地 , 序列 \xhhh 允 许 你 以 一 个 十 六 进 制 字 符 代 码 指 定 任 何 一 个 ASCII 字 符 , 例 如 ,你 可 以 以 正 常 的 C 转 义 序 列 (\b) 或 \010( 八 进 制 ) 码 或 \x008( 十六 进 制 ) 码 给 出 ASCII 回 退 符 。
在 一 个 八 进 制 转 义 序 列 中 你 只 能 使 用 0 ~ 7 数 字 。 八 进 制 转 义 序 列 不 能长 于 3 个 数 字 并 以 第 一 个 不 是 一 个 八 进 制 数 字 的 字 符 结 束 。 虽 然 你 不 需要 使 用 所 有 三 个 数 字 , 但 必 须 至 少 使 用 一 个 , 例 如 ,ASCII 回 退 符 的 八 进 制表 示 是 \10, 字母 A 的 八 进 制 表 示 是 \101 ,正 如 ASCII 表 给 出 的 。
类 似 地 , 你 必 须 为 十 六 进 制 转 义 序 列 至 少 给 出 一 个 数 字 , 但 可 以 省 略 第 二个 和 第 三 个 数 字 。 因 此 , 你 可 以 对 回 退 符 指 出 十 六 进 制 转 义 序 列 为 \x8 、
\x08 或 \x008 。
八 进 制 或 十 六 进 制 转 义 序 列 的 值 必 须 在 这 样 的 可 表 示 范 围 内 , 对 于 字 符常 量 是 类 型 unsigned char 的 可 表 示 值 范 围 ; 对 于 宽 字 符 常 量 是 类 型wchar_t 的 可 表 示 值 范 围 。 有 关 宽 字 符 常 量 的 信 息 参 见 本 章 前 面 的 “ 多字 节 或 宽 字 符 ”。
不 同 于 八 进 制 转 义 常 量 , 一 个 转 义 序 列 中 十 六 进 制 数 字 的 数 值 是 没 有 限制 的 , 一 个 十 六 进 制 转 义 序 列 以 第 一 个 不 属 于 十 六 进 制 数 字 的 字 符 终止 。 因 为 十 六 进 制 数 字 包 括 字 字 母 a 到 f, 小 心 确 保 该 转 义 序 列 在 指 定 的数 字 终 止 。 为 了 避 免 混 乱 , 你 可 以 在 一 个 宏 定 义 中 放 置 八 进 制 或 十 六 进制 字 符 定 义 :
#define Bell ′ \x07 ′
对 于 十 六 进 制 值 , 你 可 以 分 解 该 字 符 串 以 便 清 楚 地 显 示 正 确 的 值 :
"\xabc" /* 一个字符 */ "\xab" "c" /* 两个字符 */
字 符 串 文 字
一 个 “ 字 符 串 文 字 ” 是 来 自 源 字 符 集 中 的 字 符 用 双 引 号 ( “ ” ) 括 起 来 的字 符 序 列 。 字 符 串 文 字 用 于 表 示 以 空 格 字 符 结 尾 的 字 符 串 的 字 符 序 列 , 对 于 宽 字 符 串 文 字 , 其 前 必 须 加 上 前 缀 L 。
语 法
字 符 串 文 字 :
"s 字 符 序 列 opt"
L"s 字 符 序 列 opt" s 字 符 序 列 :
s 字 符
s 字 符 序 列 s 字 符
s 字 符 :
源 字 符 集 中 除 双 引 号 (")、 反 向 斜 杠 (\)或 换 行 符 之 外 的 任 何 成 员转 义 序 列
如 下 例 子 是 一 个 简 单 的 字 符 串 文 字 :
char amessage="This is a string literal.";
表 1.4 中 列 出 的 所 有 转 义 码 都 是 有 效 的 字 符 串 文 字 。 为 了 在 一 个 字 符 串文 字 中 表 示 一 个 双 括 号 , 使 用 转 义 序 列 \" 。 单 引 号 ( ′ ) 没 有 转 义 序 列 也 可以 表 示 。 反 向 斜 杠 (\) 在 一 个 字 符 串 中 的 表 示 是 其 后 必 须 跟 第 二 个 反 向 斜杠 (\\) 。 当 一 个 反 向 斜 杠 出 现 在 一 行 的 末 尾 时 , 它 总 是 解 释 成 一 个 续 行 符 。
字 符 串 文 字 的 类 型
字 符 串 文 字 具 有 char 的 类 型 数 组 ( 也 就 是 char[])( 宽 字 符 串 具 有 wchar_t 的 类 型 数 组 ( 也 就 是 wchar_t[])) 。 这 样 意 味 着 一 个 字 符 串 是 一 个 具 有 类型 char 元 素 的 数 组 。 该 数 组 中 元 素 成 员 等 于 该 字 符 串 中 字 符 个 数 加 上 1 即 结 尾 的 空 格 字 符 。
字 符 串 文 字 的 存 储
一 个 字 符 串 文 字 的 字 符 顺 序 存 储 在 相 邻 的 存 储 器 位 置 。 一 个 字 符 串 文 字中 的 一 个 转 义 序 列 (例 如 \\或 \") 都 作 为 单 个 字 符 计 数 。 一 个 空 格 字 符 ( 由 \0 转 义 序 列 表 示 ) 自 动 添 加 , 作 为 每 个 字 符 串 文 字 的 结 尾 标 志 ( 这 出 现 在 转 换阶 段 7 中 ) 。注 意 编 译 器 不 可 能 在 不 同 的 地 址 存 储 两 个 相 同 字 符 串 。/Gf( 删除 重 复 字 符 串 ) 编 译 器 选 项 强 制 编 译 器 把 相 同 字 符 串 拷 贝 放 进 可 执 行 文件 中 。
Microsoft 特 殊 处 →
字 符 串 具 有 静 态 存 储 期 。 有 关 静 态 存 储 器 的 信 息 , 参 见 第 3 章 说 明 和 类型 中 的 “ 存 储 类 ”。
Microsoft 特 殊 处 结 束字 符 串 文 字 连 接
为 了 构 成 占 用 多 行 的 字 符 串 文 字 , 你 可 以 连 接 两 个 字 符 串 。 为 此 , 键 入 一个 反 向 斜 杠 ,然 后 按 RETURN 键 。 该 反 向 斜 杠 导 致 编 译 器 忽 略 后 面 的 换行 符 。 例 如 ,字 符 串 文 字 :
"Long strings can be bro\
ken into two or more pieces."
与 以 下 字 符 串 文 字 是 相 同 的 :
"Long strings can be broken into two or more pieces."
字 符 串 连 接 可 以 用 于 以 前 采 用 一 个 反 向 斜 杠 跟 一 个 换 行 字 符 来 输 入 多 于
一 行 的 字 符 串 文 字 的 任 何 地 方 。
为 了 在 一 个 字 符 串 文 字 中 强 制 换 行 , 在 该 字 符 串 中 要 求 分 断 该 行 的 地 方插 入 一 个 换 行 转 义 序 列 (\n),如 下 :
"Enter a number between 1 and 100\nOr press return"
因 为 字 符 串 可 以 在 源 代 码 中 的 任 何 列 开 始 , 并 且 长 字 符 串 可 以 继 续 到 下一 行 的 任 何 列 , 你 可 以 定 位 该 字 符 串 增 加 源 代 码 的 可 读 性 , 无 论 哪 种 情 况输 出 的 屏 幕 表 示 不 受 影 响 。 例 如 :
printf("This is the first half of the string," this is the second half");
字 符 串 的 每 部 分 都 包 含 在 双 引 号 中 , 各 部 分 连 接 起 来 作 为 单 个 字 符 串 来
输 出 , 这 种 连 接 在 转 换 阶 段 指 定 的 编 译 中 根 据 事 件 的 序 列 来 执 行 。
"This is the first half of the string,this is the second half"
一 个 字 符 串 指 针 , 初 始 化 为 两 个 由 空 白 分 隔 的 不 同 字 符 串 文 字 , 而 作 为 单个 字 符 串 进 行 存 储 ( 指 针 在 第 3 章 “ 说 明 和 类 型 ” 中 的 “ 指 针 说 明 ” 中讨 论 )。 适 当 地 引 用 ,正 如 下 面 的 例 子 ,结 果 与 前 面 的 例 子 是 相 同 的 :
char *string="This is the first half of the string," "this is the second half";
printf("%s",string);
在 转 换 阶 段 6 中 , 由 任 何 相 邻 字 符 串 文 字 或 相 邻 宽 字 符 串 文 字 序 列 指 定的 多 字 节 字 符 序 列 都 连 接 成 单 个 多 字 节 字 符 序 列 。 因 此 , 不 要 设 计 这 样的 程 序 , 允 许 在 执 行 中 修 改 字 符 串 文 字 。 ANSI C 标 准 指 出 修 改 一 个 字 符
串 的 结 果 是 不 确 定 的 。
最 大 字 符 串 长 度
Microsoft 特 殊 处 →
ANSI 兼 容 性 需 要 一 个 编 译 器 在 连 接 之 后 的 一 个 字 符 串 文 字 中 至 多 可 接受 509 个 字 符 ,在 M icrosoft C 中 允 许 的 一 个 字 符 串 文 字 的 最 大 长 度 接 近2048 个 字 节 。 如 果 字 符 串 文 字 由 包 含 在 双 引 号 中 的 各 部 分 组 成 , 预 处 理器 把 这 些 部 分 连 接 成 单 个 字 符 串 , 对 于 每 个 连 接 的 行 , 还 增 加 一 个 额 外 字节 到 字 节 总 数 中 。
例 如 , 假 设 一 个 字 符 串 由 40 行 组 成 ,每 行 50 个 字 符 ( 共有 2000 个 字 符 ),另有 一 个 7 个 字 符 的 行 , 每 行 用 双 引 号 括 起 来 ,这 样 2007 个 字 节 加 上 结 尾 空格 字 符 的 一 个 字 节 , 总共 2008 个 字 节 。 在 连 接 时 ,每 行 增 加 一 个 额 外 字 符到 第 一 行 , 这 样 总 共 有 2048 个 字 节 。 注 意 , 如 果 用 续 行 符 (\) 代 替 双 引 号 , 预 处 理 器 不 会 为 每 行 都 增 加 一 个 额 外 的 字 符 。
Microsoft 特 殊 处 结 束
标 点 和 特 殊 字 符
在 C 字 符 集 中 标 点 和 特 殊 字 符 有 各 种 用 途 ,从 组 织 程 序 文 本 到 定 义 编 译器 或 编 译 的 程 序 的 执 行 功 能 。 它 们 不 指 定 执 行 的 操 作 。 有 些 标 点 符 号 也是 运 算 符 ( 参 见 第 4 章 “ 表 达 式 和 赋 值 ” 中 的 “ 运 算 符 ” )。 编 译 器 从 上
下 文 确 定 它 们 的 用 途 。
语 法
标 点 : 如 下 之 一
[ ] ( ) { } * , : = ; ... #
这 些 字 符 在 C 中 具 有 特 定 含 义 , 它 们 的 作 用 在 本 书 中 描 述 。 # 号 (#) 仅 在 预处 理 命 令 中 出 现 。