当前位置: C语言 -- 基础 -- 环境考量

环境考量(一)


C程序的编译和执行会受到环境的影响。环境考量(environmnetal considerations)主要包括以下几个方面:字符集(character sets)、字符显示语义(character display semantics)、信号和中断(signals and interrupts)、环境限制(environmental limits)。


一、字符集

字符是用于组织、控制或者表示数据的元素集成员。C语言存在两套字符集:源字符集(source character set)和执行字符集(execution character set)。源字符集是写入源文件的字符集;执行字符集是执行环境中解释的字符集。这两套字符集又可以进一步分为基本字符集(basic character set)和由0个或者多个特定语言环境成员(该成员称为扩展字符(extended characters),扩展字符不是基本字符集成员。)组成的字符集。基本字符集和扩展字符统称为扩展字符集(extended character set)。


无论基本源字符集还是基本执行字符集,都应包含以下成员:

① 26个大写拉丁字母

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

② 26个小写拉丁字母

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

③ 10个十进制数字

0 1 2 3 4 5 6 7 8 9

④ 32个图形字符

! " # % & ' ( ) * + , - . / :

; < = > ? [ \ ] ^ _ { | } ~

@ $ `

@$`字符是ISO/IEC 9899:2024标准新增的基本字符集成员。)

空格符和控制字符(水平制表符垂直制表符换页符。)


无论是源字符集还是执行字符集,基本字符集中的字符都使用一个字节表示;十进制数字列表中每个0后面的字符值应比前一个字符值大1

源文件中应存在某种方式表示每个文本行的末尾;ISO/IEC 9899:2024标准将这样的行尾指示符视为单个换行符。基本执行字符集中应存在表示警告退格回车换行的控制字符。执行字符集成员值由实现定义。

字符常量或者字符串字面量中,执行字符集成员应由源字符集的对应成员或者转义序列来表示。一个字节所有位都为0,称为空字符(null character)。基本执行字符集应包含空字符;空字符用于终止字符串。


如果在源文件中出现其它字符(如果出现在标识符、字符常量、字符串字面量、头文件名、注释或者不会转换成标记预处理标记中除外。),其行为是未定义的。

大小写字母的定义如上所示,ISO/IEC 9899:2024标准并未包含其它字母表中的其它字符。

通用字符名提供了一种命名其它字符的方法。


1、三字符序列

ISO/IEC 9899:2024标准已弃用三字符序列。)

三字符序列(trigraph sequences):在进行任何其它处理前,三字符序列会被替换为对应的单个字符。三字符序列以两个?字符开始,第三个字符决定三字符序列表示的符号。使用三字符序列能够输入未在ISO/IEC 646标准固定代码集(Invariant Code Set)中定义的字符(该固定代码集是7ASCII字符集的子集。)。ISO/IEC 9899:2018标准第5.2.1.1 Trigraph sequences节提供了9个三字符序列,具体如下:

三字符序列
三字符序列 表示字符 三字符序列 表示字符 三字符序列 表示字符
??= # ??) ] ??! |
??( [ ??' ^ ??> }
??/ \ ??< { ??- ~

三字符序列在c程序编译的第一阶段替换成对应的单字符,例如:

??=include <stdio.h>

将替换为

#include <stdio.h>

不是开始三字符序列的?字符在编译时不会发生这种替换,例如:

puts("???=");

将输出

?#


如果不希望三字符序列在编译时被替换成单字符,可以使用转义序列表示?字符,例如:

puts("?\?\?=");

将输出

???=


编译时三字符序列的替换先于转义序列的替换,例如:

puts("\\??=");

将输出

\#


2、多字节字符

源字符集可能包含多字节字符(multibyte characters),用于表示扩展字符集成员;执行字符集也可能包含多字节字符,但这些字符不需要与源字符集具有相同的编码。无论是源字符集,还是执行字符集,以下内容应适用:

-- 无论源字符集,还是执行字符集都应提供基本字符集,每个字符应使用单个字节编码。

-- 扩展字符的存在、含义和表示与特定语言环境有关。

-- 多字节字符集可能使用依赖状态的编码(state-dependent encoding),其中每个多字节字符序列从初始移位状态(initial shift state)开始,当遇到序列中特定的多字节字符时进入其它特定语言环境的移位状态(locale-specific shift states)。当处于初始移位状态时,单字节字符保留其通常的解释,不会改变移位状态。序列中后续字节的解释是当前移位状态(current shift state)的功能。

-- 所有位为0的字节应解释为与移位状态无关的空字符。这种字节不能作为任何其它多字节字符的一部分。


对于源文件,以下内容应适用

-- 标识符、注释、字符串字面量、字符常量或者头文件名(header name)应以初始移位状态开始和结束。

-- 标识符、注释、字符串字面量、字符常量或者头文件名(header name)应由有效的多字节字符序列组成。