目 录

第 一 部 分 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 章 编 译 指 示 指 令附 录 语 法 总 结

引 言 - 图1返 回 总 目 录

M icrosoft Visual C 6 .0

语 言 参 考 手 册

第 一 部 分 目 录

引 言 6

C 语 言 参 考 手 册 的 组 织 6

本 手 册 的 范 围 6

ANSI 一 致 性 7

第 1 章 C 的 基 本 元 素 8

语 言 符 号 9

注 释 10

关 键 词 13

标 识 符 14

常 量 20

字 符 串 文 字 37

标 点 和 特 殊 字 符 41

2 章 程 序 结 构 43

源 文 件 和 源 程 序 43

main 函 数 和 程 序 执 行 51

命 令 行 参 量 的 分 析 55

生 存 期 、 范 围 、 可 见 性 和 连 接 58

名 称 空 间 65

3 章 说 明 和 类 型 68

说 明 概 述 69

存 储 类 72

指 示 符 83

类 型 修 饰 符 87

说 明 符 和 变 量 说 明 89

解 释 更 复 杂 的 说 明 符 122

基 本 类 型 的 存 储 136

不 完 整 类 型 143

typedef 说 明 144

扩 充 的 存 储 类 属 性 148

4 章 表 达 式 和 赋 值 154

操 作 数 和 表 达 式 154

运 算 符 163

类 型 转 换 205

5 章 语 句 219

语 句 概 述 219

break 语句 220

复 合 语 句 222

continue 语 句 224

do-while 语 句 225

表 达 式 语 句 226

for 语 句 227

goto 和 标 号 语 句 229

if 语 句 231

空 语 句 233

return 语句 234

switch 语 句 236

try-except 语 句 240

try-finally 语 句 244

while 语句 245

6 章 函 数 247

函 数 概 述 247

函 数 定 义 249

函 数 原 型 274

函 数 调 用 277

附 录 A C 语 言 语 法 总 结 286

定 义 和 约 定 286

词 法 287

短 语 结 构 语 法 295

附 录 B 实 现 定 义 的 行 为 308

转 换 : 诊 断 308

环 境 309

标 识 符 的 行 为 310

字 符 311

整 数 315

浮 点 数 学 319

数 组 的 指 针 320

寄 存 器 :寄 存 器 的 可 用 性 321

结 构 、 联 合 、 枚 举 和 位 域 322

修 饰 符 :访 问 volatile 对 象 325

说 明 符 :最 大 个 数 325

语 句 :switch 语 句 的 限 制 326

预 处 理 器 命 令 326

库 函 数 330

引 言

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 代 码 会 产 生 错 误 或 警 告 。

1C 的 基 本 元 素

本 章 描 述 了 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 编 译 器 识 别 的 关 键 词 和 指 定 标 识 符 如 下 :

__

  1. __ based 关键词限制用于 32 位目标编译。

  2. 这些是与 __ 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 中 具 有 特 定 含 义 , 它 们 的 作 用 在 本 书 中 描 述 。 # 号 (#) 仅 在 预处 理 命 令 中 出 现 。