1、中华人民共和国国家标准程序设计语言发布实施国家技术监督局发布中华人民共和国国家标准程序设计语言国家技术监督局批准实施本标准等同采用了国际标准程序设计语言引言随着新设备和扩展字符集的引入标准中可能会增加新的特征在语言和库两章中的有关条文对实现者和程序员使用尽管本身是合法的但可能与未来增加的内容相冲突的特征给出了告诫有一些特征属于将逐渐废弃的这意味着在未来的标准版本中可能会撤消这些特征本标准文本中仍然保留它们的原因是这些特征已使用得很广泛但不鼓励在新的实现中使用这些与实现有关的特征或在新的程序中使用这些语言特征见条或库特征见条本标准文本分为下列四个主要部分引言和基本元素翻译与执行程序的环境的特性语
2、言的语法约束与语义库设施在有些条文中给出了示例以说明所描述的构件的可能形式加注以强调在相应条文或标准的其他地点所描述的规则的作用涉及其他相关条文时给出了引用附录部分总结了包含在标准中的信息引言示例注引用和附录均不属于标准的组成部分第章语言是从中派生的第章库是基于用户协会年的标准主题内容与适用范围本标准规定了用程序设计语言书写的程序的形式及其解释注设计本标准的目的在于促进程序在各个数据处理系统之间的可移植性本标准的主要使用对象是实现者和程序员与本标准相关的一个基本文件解释了制定本标准的技术委员会的许多决策本标准规定了程序的表示语言的语法和约束解释程序的语义规则由程序处理的输入数据的表示由程序产生
3、的输出数据的表示对遵从标准的实现的限制和限定值本标准对以下内容未作规定为数据处理系统使用而对程序进行变换的机制为数据处理系统使用而调用程序的机制为程序使用而对输入数据进行变换的机制在程序产生输出数据后对其进行变换的机制将超出任何特定数据处理系统或特殊处理机容量的程序及其数据的长度与复杂性对能够支持一个遵从标准的实现的全部最低要求引用标准信息处理信息交换用七位编码字符集数据处理词汇表示货币和资金的代码二进制浮点运算定义和约定本标准中动词应解释为对实现或程序应提出的要求反之动词不应解释为应禁止下列定义适用于本标准在本标准中显式定义了的术语不能被假定为隐含在其他地方定义的类似术语在本标准中未定义的术
4、语应按解释对齐指特定类型对象应放置在存储区边界的要求该边界的地址是字节地址的特定倍数实参指函数调用表达式中由括号括起来并以逗号分隔的表中的表达式或类似函数的宏调用中由括号括起来并以逗号分隔的表中的一系列预处理单词也称实在参数二进位执行环境中的数据存储单位它应大到足以容纳一个可能具有两种值之一的对象不要求能表达一个对象中每个各别位的地址字节数据存储单位足够大以容纳执行环境中基本字符集的任何一个成员应能唯一表达一个对象中每个各别字节的地址字节由一系列相邻接的二进位组成字节中二进位的数目由实现定义字节的最低有效二进位称为低位最高有效二进位称为高位字符一个字节内能容纳的二进位表示源环境和执行环境的基本
5、字符集中的每个成员的表示都应能被容纳在一个字节内约束进一步解释语言元素评注的语法或语义限制诊断消息实现输出消息子集中的一类消息是实现定义的提前引用的条文对标准中包含与当前条文相关信息的后续条文的提前引用实现一个特定的软件集合它运行在一个受到特殊控制任选的特定翻译环境为一个特定执行环境实现采用说明等同采用在本标准第章出现在本标准第章出现程序的翻译并支持函数在该执行环境中的执行实现定义的行为指对依赖于实现特性的且是正确的程序构件和数据的行为每个实现对这些行为均应用文档说明实现规定的限定值实现对程序所规定的限定值地域特定的行为指依赖于地域国别文化和语言习惯的行为每个实现对这些行为均应用文档说明多字节
6、字符由一个或多个字节构成的序列表示源环境或执行环境中扩展字符集的一个成员扩展字符集是基本字符集的超集对象执行环境中的数据存储区其内容表示值除位段以外对象由一个或多个邻接的字节组成对象中的字节数目次序编码或者显式规定或者由实现定义当被引用时对象可被解释为具有特殊类型见条形参一种对象是声明为具有入口值的函数声明或函数定义的一部分或是紧跟在类似函数的宏定义的宏名之后由括号括起来并以逗号分隔的表中的标识符也称形式参数未定义的行为指当使用了一个不可移植的或是错误的程序构件或错误的数据或无法确定值的对象时的行为而标准并未对这些行为加以规定所允许的对未定义的行为的处理包括尽管可能出现不可预测的结果也完全忽略
7、该情况在翻译或程序执行时按环境文档规定的特性处理不保证出现诊断消息终止翻译或执行保证出现诊断消息若违反了在约束条文以外出现的应或不应要求则该行为是未定义的其他未定义的行为在本标准文本中用文字未定义的行为或由省略任何显式的行为定义来指示对这三种情况并不强调任何区别它们都描述没有定义的行为未规定的行为指标准未提出任何要求的且是正确的程序构件或数据的行为示例函数实参求值的顺序是一种未规定的行为整数溢出时的行为是一种未定义的行为有符号整数右移时高位如何传递是一种实现定义的行为对除个小写英文字母外的字符函数是否返回真值是一种地域特定的行为提前引用的条文逐位移位算符条表达式条函数调用条函数条本地化程序库前
8、导文卷条一致性一个严格遵从标准的程序应当只使用本标准中规定了的那些语言和库特征它不应产生依赖于未规定的或未定义的或实现所定义的行为的输出也不应超出任何实现规定的最低限定值遵从标准的实现有两种形式宿主型和独立型一个宿主型遵从实现应当接受任何严格遵从的程序一个独立型遵从实现应当接受任何严格遵从的程序该程序中对在本标准第章库中所规定了的特征的使用与标准前导文卷和一致一个遵从实现可以有扩展包括附加的库函数只要这些扩展不改变严格遵从程序的任何行为遵从程序是指遵从实现可接受的程序注这意味着一个遵从实现不得保留除本标准中显式规定保留的标识符以外的任何标识符预期严格遵从程序在各遵从实现之间有最大限度的可移植性
9、遵从程序可能会依赖于遵从实现的某些非可移植性特征一个实现应附有定义所有实现定义特征及其扩充的文档提前引用的条文限定值前导文卷和条变长实参库前导文卷条公用定义库前导文卷条环境实现分别在两个数据处理环境中翻译源文卷并执行程序在本标准中分别称它们为翻译环境和执行环境它们的特性定义并约束按照遵从实现的语法和语义规则所构造的遵从程序的执行结果提前引用的条文在第章环境中仅给出了许多可能的提前引用的条文中的一小部分概念化模型翻译环境程序结构一个程序并不一定要全都在同一时刻翻译程序文本存放在本标准中称为源文卷的单位中一个源文卷连同经预处理指示并入的所有前导文卷和源文卷扣除由条件并入预处理指示所跳过的源程序行后
10、称为一个翻译单位以前翻译过的翻译单位可单独保存或存在库中一个程序的各个翻译单位之间通过例如对标识符具有外部链接的函数的调用对标识符具有外部链接的对象的操作或对数据文卷的操作等手段进行通信翻译单位可以先分别翻译然后链接产生一个可执行的程序提前引用的条文条件并入条标识符的链接条源文卷并入条翻译阶段翻译的语法规则之间的优先顺序由下列阶段规定阶段若有必要则将物理文卷字符映射到源字符集对行尾指示符引入新行字符用相应的单字符内部表示替换三联符序列阶段删除每个反斜线字符后紧跟一个新行字符的字符对分割物理源程序行以构成逻辑源程序行不为空的源文卷应以一个新行字符结束该新行字符前不应有紧接的反斜线字符阶段将源文卷
11、分解为预处理单词和一系列的白空类符包括注释源文卷不应在不完整的预处理单词或注释处结束对每条注释都用一个空格字符替换保留新行字符对除新行外的不为空的一系列白空类符的处理是保留还是用一个空格字符替换由实现定义阶段执行预处理指示展开宏调用预处理指示将导致递归地从阶段到阶段处理命名的前导文卷或源文卷阶段将第一个源字符集成员以及字符常量和串字面值中的转义序列转换为执行字符集中的成员阶段串接邻接的字符串字面值单词和邻接的宽串字面值单词阶段此时分隔单词的白空类符不再有意义每个预处理单词都转换为一个单词对如此得到的单词进行语法分析和语义分析并加以翻译阶段解决所有外部的对象引用和函数引用链接有关的库成分以满足对
12、未在当前翻译单位内定义的对象和函数的外部引用将所有这类翻译程序的输出收集到一个程序映象中该映象包含了在其执行环境中执行时所需的信息注即使在实践中常把几个阶段合并在一起但实现必须表现为如同这些阶段分离出现一样如在条中所描述的将源文卷字符分解为预处理单词的过程是上下文相关的作为例子请参见在预处理指示中对的处理提前引用的条文词法元素条预处理指示条三联符序列条诊断一个遵从实现对每个违反任何语法规则或约束的翻译单位应至少以一种实现定义的方式产生一条诊断消息在其他情况下不需产生诊断消息注目的是实现应标识每个违约的性质并尽可能定位当然只要对一个合法的程序仍在进行正确的翻译实现就可自由地产生任意数目的诊断消息
13、实现也可成功地翻译一个不合法的程序执行环境共定义了两种执行环境独立环境与宿主环境在两种环境中当由执行环境调用一个指定的函数时都发生程序启动在程序启动前应对在静态存储区中的所有对象进行初始化置为它们的初值这种初始化的方式和定时在其他地方都未规定程序终止把控制返回给执行环境提前引用的条文初始化条独立环境在独立环境即程序在其中的执行无需操作系统的任何支持的环境中程序启动时调用的函数的名字和类型是实现定义的除此以外再无保留的外部标识符独立程序可用的任何库设施都是实现定义的在独立环境中程序终止的效果也是实现定义的宿主环境不一定需要提供宿主环境但若提供则应遵从下列规格说明程序启动程序启动时调用的函数命名为
14、实现不必声明此函数的原型它可被定义为不带形参或者带两个形参尽管在此使用了名字和但由于它们局部于声明它们的函数因此可使用任何名字若定义了函数则其形参应遵循下列约束的值不应为负值应为一个空指针若的值大于零则数组成员至应包含指向串的指针由宿主环境在程序启动前把实现定义的值赋给这些串这样做的目的是向程序提供由宿主环境的其他部分在程序启动前确定的信息若宿主环境不能提供大小写字母并存的串则实现应保证这些串以小写字母接收若的值大于零则由所指向的串表示程序名若不能从宿主环境获得程序名则应是空字符若的值大于则由至所指向的串表示程序参数形参和以及由数组所指向的串应是可由程序修改的并保持从程序启动至程序终止期间最后
15、一次存储的值程序执行在宿主环境中程序可使用第章库中描述的所有函数宏类型定义和对象程序终止从对函数的初始调用中返回等价于用函数的返回值作为实参调用函数若函数执行一个不规定值的返回操作则返回到宿主环境的终止状态是未定义的提前引用的条文术语定义条函数条程序执行本标准中的语义描述说明了一个抽象机的行为在该抽象机中不涉及优化问题访问易变型对象修改对象修改文卷或调用执行上述任何操作的函数都是副作用它们是执行环境的状态变化对表达式求值可能出现副作用在执行序列中称为序点表达式求值的顺序控制点的某些特定点所有先前求值的副作用均应完成并且后继求值所需的副作用不应在此之前发生在抽象机中所有的表达式都按语义规定求值若
16、某个实际实现可以推断出尚不用某个表达式的值也不用产生必须的副作用包括调用函数或访问易变型对象所引起的任何副作用则该实现可不必对该表达式的任何部分求值当抽象机的处理由于收到一个信号而中断时仅能依赖作为上一个序点的对象的值在上一个序点和下一个序点之间可能被修改的对象不一定已接收到它们的正确值在进入自动存储期的对象所在的程序块时对每个自动存储期的对象都产生一个与之相关的实例这类对象在该程序块执行时以及在该程序块由于调用函数或收到一个信号而挂起时存在并保持其最后存储的值对一个遵从实现的最低要求是当在序点时易变型对象在前面的求值已完成且后继求值尚未发生这种意义上是稳定的当在程序终止时所有已写到文卷中的数
17、据应与按抽象语义执行程序时所应该产生的结果相同交互设备的动态输入输出应按条所规定的发生提出这些要求的目的是使无缓冲的或行缓冲的输出尽可能早出现保证在程序等待输入以前已实际出现提示消息交互设备的组成是实现定义的抽象语义与实际语义之间更严格的对应关系可由每个实现定义示例实现可在抽象语义与实际语义之间定义一一对应关系在每个序点实际对象的值都与由抽象语义规定的对象的值一致此时关键字将是冗余的或者实现也可在每个翻译单位内部进行各种各样的优化使得仅当进行跨越翻译单位边界的函数调用时实际语义才与抽象语义一致在这类实现中对于主调函数和被调函数在不同翻译单位中的情况当每次进入函数和由函数返回时所有外部链接的对象
18、的值和所有可通过指针访问的对象的值将与抽象语义一致而且在这类函数入口时被调函数的形参值及所有可通过指针访问的对象的值将与抽象语义一致在这类实现中由函数激发的中断服务例行程序所引用的对象将需要存储的显式规格说明以及其他实现定义的限制执行下列程序片断时整型升格要求抽象机先将每个变量的值升格为的尺寸再将两个量相加然后截断其和只要能对两个型量相加且不产生溢出异常则实际执行只需产生相同的结果可以省略升格类似地在程序片断中若实现可保证结果如同采用双精度运算执行例如用常量替换该常量的类型为一样则可用单精度运算执行乘法或者如果既不会超出值域范围也不会失去精度那么仅涉及或的运算也可使用双精度运算执行为了解释表达
19、式组合的行为在下列程序片断中由于加法算符的结合律与优先级上述表达式语句的表现确实与语句相同即的结果与相加加得的结果再加上得到赋予的值在溢出将产生异常且可表示的值的范围是的机器上实现不能将上述表达式重写为因为若和的值分别为和则和将产生一个异常而原先的表达式则不会上述表达式也不能重写为或因为和的值可能分别为和或和然而在溢出不产生异常且溢出的结果可逆的机器上实现可将该表达式语句重写成上述任何一种形式因为它们全都会得到同样的结果表达式的组合不完全决定它的求值在下列程序片断中该表达式语句如同写作一样组合但的实际增量可以在前一个序点和下一个序点分号之间的任何时间出现而对函数的调用可在需要它的返回值之前的任
20、何时刻出现提前引用的条文复合语句或块条表达式条文卷条序点条条函数条类型限定词条有关环境的考虑字符集应定义两个字符集及与它们相关的理序序列用于书写源文卷的字符集和在执行环境中解释的字符集执行字符集成员的值是实现定义的任何在本条要求之外的附加成员均是地域特定的在字符常量或串字面值中执行字符集中的成员应当用对应的源字符集成员或者用由一个反斜线字符后紧跟一个或多个字符所组成的转义序列来表示在基本执行字符集中应有一个其字节的所有位均置为的称为空字符的字符空字符用来终止一个字符串字面值基本源字符集和基本执行字符集均应至少具有下列成员英文字母表中的个大写字母英文字母表中的个小写字母个十进制数字字符下列个图形
21、字符再加上空格字符以及表示横向制表纵向制表和换页的控制字符在源字符集和基本执行字符集中上述十进制数字字符表中之后的每个字符的值均应比前一个字符的值大在源文卷中应有某种方式指示每一行正文的结束本标准将这种行尾指示符按单个新行字符处理在执行字符集中应有表示告警退格回车和新行的控制字符若在源文卷中遇到除出现在字符常量串字面值前导文卷名注释或永不被转换为单词的预处理单词中的字符外的其他字符则其行为是未定义的提前引用的条文字符常量条预处理指示条串字面值条注释条三联符序列下列三个字符的序列称为三联符序列它们在源文卷中的所有出现都用对应的单字符替换不存在其他的三联符序列对不是开始上述三联符序列之一的不作改变
22、注三联符序列使得可以输入未在中定义的字符是七位代码集的一个子集示例下列源行在替换三联符序列后成为多字节字符源字符集中可包含多字节字符用于表示扩展字符集的成员执行字符集中也可包含多字节字符但它们的编码不一定要与源字符集中的多字节字符的编码相同下列条件对两个字符集均应成立应包含在条中所定义的单字节字符任何附加成员的存在含义和表示均是地域特定的一个多字节字符可具有依赖于状态的编码每个多字节字符序列以一个初始转义状态开始当在序列中遇到特定的多字节字符时进入其他实现定义的转义状态当处在初始转义状态时所有单字节字符均保持它们通常的解释且不改变转义状态序列中后断字节的解释是当前转义状态的函数所有位均为的字节
23、应独立于转义状态一概解释为空字符所有位均为的字节不应作为多字节字符的第二个或后继的字节出现对源字符集下列条件应成立注释串字面值字符常量或前导文卷名均应以初始转义状态开始和结束注释串字面值字符常量或前导文卷名均应由合法的多字节字符序列组成字符显示语义活动位置是指在显示设备上由函数输出的下一个字符应出现的位置把一个可印刷的如由函数所定义的字符写到显示设备上的目的是在活动位置上显示该字符的图形表示然后将活动位置推进到当前行的下一个位置写的方向是地域特定的若活动位置已处在一行的最后一个位置则其行为是未规定的表示执行字符集中非图形字符的字母转义序列的作用是在显示设备上产生下列动作告警产生一个可听或可视的
24、告警信息不应改变活动位置退格将活动位置移至当前行的前一个位置若活动位置已处于当前行的起始位置则其行为是未规定的换页将活动位置移至下一个逻辑页面的起始位置新行将活动位置移至下一行的起始位置回车将活动位置移至当前行的起始位置横向制表将活动位置移至当前行的下一个横向表格位置若活动位置已处于或越过所定义的最后一个横向表格位置则其行为是未规定的纵向制表将活动位置移至当前行的下一个纵向表格起始位置若活动位置已处于或越过所定义的最后一个纵向表格位置则其行为是未规定的这些转义序列中的每一个均应产生一个实现定义的唯一值该值应能存储在单个型对象中它们在文本文卷中的外部表示不必与内部表示完全相同且已超出本标准的范围
25、提前引用的条文函数条函数条信号与中断函数应当这样实现它们在任何时刻均可被一个信号中断或由一个信号处理程序调用或二者兼可并且在中断后不改变早些时候的但仍活动着的调用者的控制流也不改变函数的返回值或自动存储期的对象所有这类对象均应按每次调用为基础保存在函数映象即组成函数的可执行表示的指令之外不保证标准库中的函数能再入并且它们可能修改静态存储期的对象环境限定值翻译环境和执行环境二者均约束语言翻译程序和库的实现下列条文总结了环境对遵从实现所施加的限定值翻译限定值实现应至少翻译并执行一个程序该程序应至少包含下列每一限定值的一个实例注实现应尽可能避免施加固定的翻译限定值复合语句循环控制结构和选择控制结构的
26、嵌套层次允许为层条件并入的嵌套层次允许为层可以有个指针数组和函数声明符它们可以任何方式组合修改声明中的算术结构联合或不完整类型在一个完全的声明符中加括号的声明符的嵌套层次允许层在一个完全的表达式中加括号的表达式的嵌套层次允许层内部标识符或宏名中前个字符有效外部标识符中前个字符有效一个翻译单位内可有个外部标识符在一个块内声明的具有块作用域的标识符允许有个在一个翻译单位内允许同时定义个宏标识符一个函数定义中允许有个形参一个函数调用中允许有个实参一个宏定义中允许有个形参一个宏调用中允许有个实参一个逻辑源行中允许有个字符在串接后一个字符串字面值或宽串字面值中允许有个字符一个对象允许占个字节仅对宿主环境
27、的文卷允许嵌套层一个语句中允许有个标号不包括嵌套的语句中的标号单个结构或联合允许有个成员单个枚举中允许有个枚举常量单个结构声明表中允许有层嵌套的结构或联合定义数值限定遵从实现应用文档说明在本条中规定的所有限定值这些限定值将在前导文卷和中规定整型的尺寸应使用在预处理指示中所用的常量表达式替换下面所列出的值而且除和外应由表达式替换替换用的表达式的类型与按整型升格将一个对应类型的对象转换成的表达式的类型相同它们的实现定义的值应在量值绝对值上等于或大于所示的值且符号与所示值的符合相同不是位段字节的最小对象的位数类型对象的最小值类型对象的最大值类型对象的最大值类型对象的最小值见下面类型对象的最大值见下面
28、对任何所支持的地域环境一个多字节字符的最大字节数类型对象的最小值类型对象的最大值类型对象的最大值类型对象的最小值类型对象的最大值类型对象的最大值类型对象的最小值类型对象的最大值类型对象的最大值若在表达式中使用时对类型对象的值按有符号整数处理则的值应与的值相同且的值应与的值相同否则的值应为而的值应与的值相同见条浮点数的特性浮点数的特性用表示浮点数和值的模型描述该模型提供实现所使用的浮点运算的有关信息注使用浮点模型的目的在于使每个浮点特性的描述更为清晰并不要求实现所使用的浮点运算完全一致定义每种浮点类型时使用了下列形参符号指数部分的基数大于的整数指数部分最小值和最大值之间的一个整数精度有效数中的以
29、为基的数字位数小于的非负整数有效数位一个规格化的浮点数若用下列模型表示在前导文卷的值中应是适合于在预处理指示中使用的常量表达式所有其他的值则不必一定是常量表达式除和以外的所有值对三种浮点类型均有分别有名字除外对其他所有值均给出了浮点模型表示浮点加的舍入模型由的值表征不可确定趋向零舍入为最接近的值趋向正无穷大趋向负无穷大的其他值表征实现定义的舍入行为下表中列出的值应该用实现定义的量值绝对值等于或大于所示值且符号相同的表达式替换指数部分的基数浮点有效数中的以为基的数字位数十进制数字使得一个有个十进制数位的浮点数可舍入为有个以为基的数位的浮点数且反变换后不会改变该个十进制数字若是的幂否则使得的该次幂
30、是一个规格化浮点数的最小负整数使得的该次幂是规格化浮点数数值范围的最小负整数使得的该次幂是可表示的有穷规格化浮点数的最大整数使得的该次幂是可表示的有穷规格化浮点数数值范围的最大整数下表中列出的值应该用实现定义的值等于或大于所示值的表达式替换最大可表示的有穷浮点数下表中列出的值应该用实现定义的值等于或小于所示值的表达式替换与在给定浮点类型中可表示的大于的最小值之间的差规格化的最小正浮点数示例下面描述一个满足本标准最小要求的人为浮点表示以及在前导文卷中适合于类型的值下面描述的是也满足中单精度和双精度规格化浮点数要求的浮点表示以及在前导文卷中适合于和类型的值注在标准中的浮点模型从的次幂开始相加因此指
31、数的界值比这里所示的要小提前引用的条文条件并入条语言在本标准所使用的语法记法中语法类别非终结符用斜体表示非终结符后的冒号引出其定义除在前面冠以词下列之一的场合替代的定义均另起一行书写任选项用前导词任选的指示因此任选的表达式指示在花括号中的一个任选的表达式词法元素语法单词关键字标识符常量串字面值算符标点符号预处理单词前导文卷名标识符预处理数字符常量串字面值算符标点符号不在上述范围内的任一非白空类字符约束每个要转换为单词的预处理单词应具有关键字标识符常量串字面值算符或者标点符号的词法形式语义单词是在翻译阶段和中语言的最小词法元素共有下列几类单词关键字标识符常量串字面值算符和标点符号预处理单词是在翻
32、译阶段至中语言的最小的词法元素共有下列几类预处理单词前导文卷名标识符预处理数字符常量串字面值算符标点符号以及在词法上不与其他预处理单词类别匹配的单个非白空类字符若一个或字符与最后一个类别匹配则行为是未定义的预处理单词可被白空类符分隔白空类符由注释将在后面描述或白空类字符空格横向制表新行纵向制表和换页或二者构成如条中所述在翻译阶段中在一定情况下白空类符或其缺席的作用不仅是分隔预处理单词白空类符可出现在一个预处理单词之中但必须作为前导文卷名的一部分或出现在字符常量或串字面值中的引号字符之间若直至某个给定字符为止的输入流字符序列已被分析为预处理单词则下一个预处理单词是可构成预处理单词的最长的字符序列
33、示例程序片断将被分析为一个预处理数单词不是一个合法的浮点或整型常量单词即使若将其分析为预处理单词和也可能产生一个合法的表达式例如当是定义为的宏时类似地无论是否是一个宏名程序片断都将被分析为一个预处理数即一个合法的浮点常量单词尽管分析为可能产生一个正确的表达式程序片断也将被分析为违反对增量算符的一个约束条件的提前引用的条文字符常量条注释条表达式条浮点常量条前导文卷名条宏替换条后缀增量与减量算符条前缀增量与减量算符条预处理指示条预处理数条串字面值条关键字语法关键字下列英文单词之一语义上述英文单词全部用小写字母书写是在翻译阶段和中保留作为关键字用的不应作其他用途标识符语法标识符非数字字符标识符非数字
34、字符标识符数字字符非数字字符下列字符之一数字字符下列字符之一描述标识符是由非数字字符包括下横线和大小写字母及数字构成的序列其第一个字符应是非数字字符约束在翻译阶段和中组成标识符的字符序列不应与组成关键字的字符序列相同语义标识符表记对象函数或下列实体将在后面描述之一结构联合或枚举的标记或成员自定义类型名标号名宏名或宏形参枚举成员称为枚举常量由于在进入程序翻译的语义阶段之前源文卷中出现的所有宏名都将被用构成其宏定义的预处理单词替换故在此对宏名和宏形参不作更进一步的考虑对标识符的最大长度无特别的限定对实现的限制实现应至少将内部名无外部链接的宏名或标识符的前个字符作为有意义的字符处理对相应的大小写字母
35、按不同字母对待实现可进一步限定外部名有外部链接的标识符的有效字符数为个并对外部名中字母的大小写不加区别这些对标识符的限制均由实现定义注见条语言的发展趋向任何有效字符不一样的标识符是不同的标识符若两个标识符中仅非有效字符不同则其行为是未定义的提前引用的条文标识符的链接条宏替换条标识符的作用域标识符仅在程序文本中称为其作用域的区域中是可见的即可用的共有四类作用域函数作用域文卷作用域块作用域和函数原型作用域函数原型是一种对函数的声明它声明了该函数的参数类型标号名是唯一具有函数作用域的一种标识符它可被用在在语句中它所出现的函数中的任意位置且由其出现的语法形式后跟一个冒号和一条语句隐式地声明在一个函数中
36、的标号名应唯一其他各种标识符具有由其声明在声明符或类型区分符中所处位置所确定的作用域若声明某标识符的声明符或类型区分符出现在块或形参表之外则该标识符具有文卷作用域其作用域在翻译单位的末尾终结若声明某标识符的声明符或类型区分符出现在块内或函数定义的形参声明表之中则该标识符具有块作用域其作用域在关闭相关块的右花括号处终结若声明某标识符的声明符或类型区分符出现在函数原型而不是函数定义的一部分的形参声明表之中则该标识符具有函数原型作用域其作用域在该函数声明符的末尾终结如果在同一命名空间中存在任何词法上相同的外层标识符则该外层标识符在当前作用域终结前是被屏蔽的直到当前作用域终结后才再次成为可见的当且仅当
37、两个标识符的作用域在同一位置终结时它们才具有相同的作用域结构联合和枚举标记的作用域在声明该标记的类型区分符中该标记出现后即开始枚举常量的作用域在枚举符表中定义该常量的枚举符出现后即开始所有其他标识符的作用域在其声明符结束后开始提前引用的条文复合语句或块条声明条枚举区分符条函数调用条函数声明符包括原型条函数定义条语句条带标号语句条标识符的名字空间条宏定义的作用域条源文卷并入条标记条类型区分符条标识符的链接通过称为链接的处理可使在不同作用域中声明或在同一作用域中声明多次的标识符引用同一对象或函数共有三类链接外部链接内部链接和无链接在构成程序的一组翻译单位和库中具有外部链接的特定标识符的每个实例都表
38、记同一对象或函数在一个翻译单位中具有内部链接的标识符的每个实例也表记同一对象或函数无链接的标识符表记唯一的实体若某一对象或函数的标识符声明具有文卷作用域且含有存储类区分符则该标识符具有内部链接注仅当函数声明具有文卷作用域时才能包含存储类区分符见条若某一对象或函数的标识符声明含有存储类区分符则该标识符与任何有可见声明的具有文卷作用域的相同标识符具有同样的链接若不存在指定文卷作用域的可见声明则该标识符具有外部链接若函数标识符的声明中不含存储类区分符则其链接按如同声明为具有存储类区分符一样来决定若对象标识符具有文卷作用域且无存储类区分符则其链接是内部的下列标识符无链接不是声明为对象或函数的标识符声明
39、为函数形参的标识符声明时无存储类区分符的对象的具有块作用域的标识符若在一个翻译单位中同一标识符出现为既有内部链接又有外部链接则其行为是未定义的提前引用的条文复合语句或块条声明条表达式条外部定义条标识符的名字空间若在一个翻译单位中的任一点有多于一个对特定标识符的声明是可见的则需通过使用与语法有关的语境来消除对引用不同实体的歧义因此对不同类的标识符各有不同的名字空间如下标号名由标号声明和使用的语法来消除歧义结构联合和枚举的标记通过紧跟的关键字或中的任何一个来消除歧义注尽管有三种可能但对标记只取一种名字空间结构或联合的成员每个结构或联合对其成员有各自的名字空间通过以或算符访问成员的表达式的类型来消除
40、歧义所有其他标识符称为一般标识符以一般声明符中声明或声明为枚举常量提前引用的条文枚举区分符条带标号语句条结构和联合区分符条结构和联合成员条标记条对象的存储期对象具有存储期它决定对象的生存期共有两类存储期静态存储期和自动存储期其标识符被声明为具有外部或内部链接或声明中带有存储类区分符的对象具有静态存储期对这类对象将保留其存储区且仅在程序启动前对其存储值初始化一次在整个程序的执行过程中该类对象始终存在且保存其最后一次存储的值注对于易变型对象其最后一次存储的值在程序中有可能不是显式的其标识符被声明为无链接或声明中没有存储类区分符的对象具有自动存储期对于这类对象当正常进入与其相关的块时或当从块外部转向
41、块中或所包含的块中的带标号语句时总保证为它的一个新的实例保留存储区若对存储在该类对象中的值规定了初始化要求则每次正常进入时执行一次初始化但对于经转向带标号语句进入块的情况不执行初始化不论以何种方式终止该块的执行时对这类对象的存储区不再保证一定保留进入一个被包含的块将挂起但不终止包含块的执行调用一个函数也将挂起但不终止包含该调用的块的执行指向不再保证一定保留的自动存储期对象的指针所引用的值是不确定的提前引用的条文复合语句或块条函数调用条初始化条类型存储在对象中的值或由函数返回的值的意义由访问它的表达式的决定声明为一个对象的标识符是这种表达式中最简单的一种其类型在该标识符的声明中规定类型划分为对象
42、类型描述对象的类型函数类型描述函数的类型和不完整类型描述对象的类型但还缺少决定其尺寸所需的信息声明为类型的对象应足够大以存储基本执行字符集中的任何成员若要将条中所列举的必需的源字符集成员存储在类型对象中则它们的值保证为正值若要将其他量值存储在类型对象中其行为由实现定义该值将或者作为有符号整数或者作为非负整数处理有符号整数类型共有四类分别由和指示有符号整数类型和其他类型还可以用几种附加的方式来指示将在条中描述声明为类型的对象与普通类型对象占据一样多的存储空间普通类型对象具有由执行环境的体系结构所建议的自然的尺寸足够大以容纳在前导文卷中所定义的在至范围间的任何值在上面所列出的有符号整数类型表中每一
43、类型的值的值域均是表中下一类型值的子值域对每种有符号整数类型均有一种对应的但是不同的无符号整数类型使用关键字来指示与对应的有符号整数类型使用相同数量包括符号信息在内的存储空间且具有相同的对齐要求有符号整数类型的非负值值域是对应的无符号整数类型值的子值域且每种类型中相同值的表示法均相同涉及无符号操作数的计算决不会出现溢出这是因为当计算得到的结果无法用无符号整数类型表示时将用比该结果的无符号整数类型所能表示的最大值大的值为模对结果求模来缩小其值注相同的表示法和对齐要求意味着隐含作为函数实参函数返回值和联合成员的互换性浮点类型共有三种分别由和指示类型的值集是类型值集的子集而类型的值集是类型值集的子集
44、类型有符号和无符号整数类型以及浮点类型统称为基本类型即使实现将两种或多种基本类型的表示法定义成一样它们也还是不同的类型和三种类型统称为字符类型枚举由一系列的命名整型常量组成每个个别的枚举构成不同的枚举类型类型由一空值集组成它是一种永不可能补充完整的不完整类型由对象函数和不完整类型可构造出任意数目的派生类型如下数组类型描述相邻接分配的对象的非空集合该类对象具有特定的成员对象类型称为元素类型数组类型由其元素类型和数组中元素的数目表征称数组类型由其元素类型派生且若其元素类型为则该数组类型有时被称为数组从元素类型构造数组类型的过程称为数组类型的派生注由于对象类型中不包括不完整类型因此不可能构造一个不完
45、整类型的数组结构类型描述顺序分配的成员对象的非空集合每个成员对象具有任选的指定名且它们的类型可能不同联合类型描述重叠的成员对象的非空集合每个成员对象具有任选的指定名且它们的类型可能不同函数类型描述具有指定返回值类型的函数函数类型由其返回值类型以及形参的数目和类型表征称函数类型由其返回值类型派生且若其返回值类型为则该函数有时被称为返回的函数从返回值类型构造函数类型的过程称为函数类型的派生指针类型可由函数类型对象类型或不完整的类型派生派生指针类型的类型称为引用类型指针类型描述一类对象该类对象的值提供对该引用类型实体的引用由引用类型派生的指针类型有时称为指向的指针从引用类型构造指针类型的过程称为指针
46、类型的派生这些构造派生类型的方法可以递归地应用类型有符号和无符号整数类型以及枚举类型统称为整型整型的表示法应该使用纯二进制计数系统来定义值对浮点类型的表示法未作规定注整数的位置表示法使用二进制数字和其中由相继的二进位表示的值相加从开始分别乘以的整数次幂有时最高二进位除外整型和浮点类型统称为算术类型算术类型和指针类型又统称为标量类型数组和结构类型则统称为聚集类型注注意聚集类型中不包括联合类型因为联合类型的对象一次只能容纳一个成员未知尺寸的数组类型是不完整类型对该类型的标识符当在以后的声明中连同内部或外部链接指定了尺寸时即成为完整的类型未知内容如条中所述的结构或联合类型是不完整类型当以后在同一作用
47、域中声明相同的结构或联合标记以及所定义的内容时对所有该类型的声明该类型均成为完整的数组函数和指针类型统称为派生的声明符类型所谓从类型的声明符类型的派生是指通过应用数组函数或指针类型派生为而从构造派生的声明符类型的过程类型由其类型类别表征类型类别或者是某个派生类型的最外层派生如在上述派生类型构造中注明的或者当该类型不由任何派生类型组成时即为该类型本身迄今为止所提到的类型均是非限定类型每一非限定类型都有三种与该类型相应的限定形式常量限定形式易变型限定形式和兼有上述两种限定的形式某个类型的限定与非限定形式属于同一类型类别具有相同表示和对齐要求的不同的类型派生类型不受派生它的类型的限定词假如存在这样的
48、限定词时的限定注有关限定的数组和函数类型参见条指向类型的指针应与指向字符类型的指针具有相同的表示和对齐要求类似地指向相容类型的限定或非限定形式的指针也应具有相同的表示和对齐要求指向其他类型的指针不必具有相同的表示或对齐要求示例由指示的类型是指向的指针它的类型类别是指针而不是浮点类型该类型的限定形式由指示而由指示的类型不是限定类型该类型是指向限定的的指针是一个指向限定类型的指针指示为的类型是指向返回的函数的指针数组该类组的长度为且该函数有一类型为的单个形参其类型类别是数组提前引用的条文字符常量条相容类型和复合类型条声明条标记条类型限定词条相容类型和复合类型若两种类型相同则它们为相容类型附加的确定
49、两种类型是否相容的规则分别在条类型区分符条类型限定词和条声明符中描述而且对于在分开的翻译单位中声明的两种结构联合或枚举类型假如它们的成员个数相同成员名相同并且成员类型相容则它们是相容的对于两种相容的结构它们的成员顺序应相同对于两种相容的结构或联合它们的位段宽度应相同对于两种相容的枚举类型它们的成员应具有相同的值注两种类型相容不一定需是完全同一的所有引用同一对象或函数的声明应具有相容类型否则其行为是未定义的从两种相容的类型可构造出复合类型复合类型是与该两种类型均相容的类型且满足下列条件若一种类型是已知尺寸的数组则复合类型是该尺寸的数组若仅有一种类型是带形参表的函数类型函数原型则复合类型是带该形参表的函数原型若两种类型都是带形参表的函数类型则复合的形参类型表中每个形参的类型是对应形参的相容类型这些规则可递归地应用于派生该两种相容类型的复合类型对于在同一作用域中作为对某标识符的另一个声明所声明的具有内部或外部链接的标识符该标识符的类型成为复合类型示例给定下列两个文卷作用域声明结果得到该函数的复合类型是提前引用的条文声明符条枚举区分符条结构和联合区分符条类型定义条类型限定词条类型区分符条常量语法常量浮点