ISO/IEC 9899:2011 条款5——环境】的更多相关文章

5.环境 1.一个实现在两个不同的数据处理系统环境下分别翻译C源文件与执行C程序,在本国际标准中分别称为翻译环境和执行环境.它们的特征定义并包含了根据顺从标准实现的语法及语义规则所构造的顺从标准的C程序的执行结果. 5.1 概念模型 5.2 环境上的考虑…
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用.在本国际标准中没被定义的术语将根据ISO/IEC 2382-1进行解释.在本国际标准中没被定义的数学符号将根据ISO 31-11中进行解释. 3.1 访问 1.<运行时行为>读或修改一个对象的值 2.注1:这里,这两个行为中同时只有一个发生,要么“读”,要么“修改”被使用. 3.注2:“修改”包括…
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出,以及一组零个或多个区域特定的成员(这些不是基本字符集的成员),称为扩展字符.这些成员结合起来也被称为扩展字符集.执行字符集的成员的值是由实现定义的. 2.在一个字符常量或字符串字面量中,执行字符集的成员应该由相应的源字符集的成员或通过由倒斜杠\后面跟一到多个字符所构成的转义序列来表示.所以比特均为…
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifier    digit identifier-nondigit: nondigit         universal-character-name other implementation-defined characters nondigit:以下字符之一 _    a到z    A到Z digi…
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad: hexadecimal-digit    hexadecimal-digit    hexadecimal-digit    hexadecimal-digit 约束 2.一个通用字符名不应该指定一个字符,其短标识符比00A0要小,除了0024($),0040(@),0060(`)之外,也不应该…
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应该在程序启动前被初始化(设置为它们的初始值).这种初始化的方式以及时间点是未指定的.程序终止将控制返回给执行环境. 5.1.2.1 独立式环境 1.在一个独立式环境中(在此环境中下,C程序可以无需借助任何操作系统的帮助进行执行[译者注:比如通过虚拟机解释执行]),在程序启动时所调用的函数名和类型是由…
5.2 环境上的考虑 5.2.1 字符集 5.2.2 字符显示语义 5.2.3 信号与中断 5.2.4 环境限制…
5.1.1 翻译环境 5.1.1.1程序结构 1.一个C程序不需要一次全被翻译完.程序的文本被保存在本国际标准中被称作为源文件(或预处理文件)的单元里.一个源文件连同所有通过指示符#include所包含的头文件以及源文件一起被称作为一个预处理翻译单元.在预处理之后,一个预处理单元被称作为一个翻译单元.先前被翻译的翻译单元可以被独立地保存或保存在库里.一个程序的各个翻译单元通过(比如)对函数(其标识符具有外部连接)的调用.对对象(其标识符具有外部连接)的操作,或是对数据文件的操作进行通信.翻译单元…
6.7.3 类型限定符 语法 1.type-qualifier: const restrict volatile _Atomic 约束 2.除了指针类型(其被引用的类型是一个对象类型)之外的类型,不应该被restrict限定. 3.被_Atomic修饰的类型不应该是一个数组类型或一个函数类型. 语义 4.与限定类型相关联的属性仅对作为左值的表达式有意义.[注:实现可以将一个非volatile的一个const对象放置到一个只读存储区域.此外,实现不需要为这么一个对象分配存储空间,如果其地址永远不被…
5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执行至少一个程序,该程序包含以下每个限制的至少一个实例:[注:实现应该尽量避免强加使用固定的翻译限制.] —— 127个语句块的嵌套层级 —— 63个带条件的包含嵌套层级 —— 12个指针.数组与函数声明符(以任意结合)在一个声明中用于修饰一个算术.结构体.联合体或void类型. —— 63个圆括号包…
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为是未定义的.否则,未定义行为在本国际标准中通过“未定义行为”这一短语或通过对任一显式定义的行为的缺省进行指定.在这三种表达方式之中没有特别的重点强调:它们都描述了“未定义的行为”. 3.在所有其它方面都正确的一个程序且操作正确的数据,却含有未指定的行为,那么应该是一个正确的程序并且其行为符号5.1.…
6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中列出可替换的定义,除了当用单词“之一”开头时.一个可选的符号用下标“opt”来指示,这样 { expressionopt } 指示一个在大括号中包裹的可选的表达式. 2.当在文本中引用了语义类别时,它们不用斜体标明并且单词用空格而不是连接号(-)来分隔. 3.在附录A中给出了语言语法的概述. 6.2…
5.1 概念模型 5.1.1 翻译环境 5.1.2 执行环境…
6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了由大部分普通操作符所执行的转换:它由6.5中的每个操作符的讨论作为要求而补充. 2.对一个操作数值转换为一个兼容类型不会导致对该值或表示的改变. 6.3.1 算术操作数 6.3.2 其它操作数…
6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该操作符的结果的值计算之前.[译者注:比如 + ) * ( - ); 对于上述表达式,就对于当中的 * 操作符而言,先计算乘法操作符左右两边的操作数的计算,最后再计算乘法操作结果. ] 2.如果在一个标量对象上的副作用相对于同一标量对象上的另一个不同副作用或是使用同一标量对象的值的一个值计算,没有为其…
6.6 常量表达式 语法 1.constant-expression conditional-expression 描述 2.一个常量表达式可以在翻译期间被计算,而不是在运行时,并且根据情况可以被用于任一能够做为常量的地方. 约束 3.常量表达式不应该包含赋值.递增.递减.函数调用或逗号操作符,除了当它们包含在一个不被计算的子表达式中时.[注:sizeof或_Alignof操作符的操作数通常不被计算(6.5.3.4).] 4.每个常量表达式应该对一个常量进行计算,该常量在其类型可表示的值的范围内…
6.8.6 跳转语句 语法 1.jump-statement: goto    identifier    ; continue    ; break    ; return    expressionopt    ; 语义 2.一条跳转语句引发一个无条件跳转到另一个地方. 6.8.6.1 goto语句 约束 1.一条goto语句中的标识符应该命名一个标签,该标签坐落于当前封闭函数的某个地方.一条goto语句不应该从一个具有可变修改类型的标识符作用域的外部跳转到该标识符作用域的内部. 语义 2.…
6.7.9 初始化 语法 1.initializer: assignment-expression {    initializer-list    } {    initializer-list    ,    } initializer-list: designationopt    initializer initializer-list    ,    designationopt    initializer designation: designation-list    = des…
6.7.6 声明符 语法 1.declarator: pointeropt    direct-declarator direct-declarator: identifier (    declarator    ) direct-declarator    [ type-qualifier-listopt    assignment-expressionopt    ] direct-declarator    [ static    type-qualifier-listopt    as…
6.7.4 函数说明符 语法 1.function-specifier: inline _Noreturn 约束 2.函数说明符应该只能被用在对一个函数标识符的声明中. 3.对一个含有外部连接函数的内联定义,不应该包含含有静态或线程存储周期的可修改对象的定义,并且不应该含有对带有内部连接的一个标识符的引用.[译者注:比如 ; extern inline void hello(int a); inline void hello(int a) { static int s; // 不应该定义可修改的…
6.5.17 逗号操作符 语法 1.expression: assignment-expression expression    ,    assignment-expression 语义 2.一个逗号操作符的左操作数被计算为一个void表达式:在其计算与右操作数计算之间有一个顺序点.然后,右操作数被计算:结果是右操作数的类型与值[注:一个逗号操作符不产生一个左值.] 3.例  由语法所指示的,逗号操作符(在此子条款中描述)不能出现在一个逗号被用于分隔一个列表中项的上下文中(诸如函数的实参或初…
6.5.16 赋值操作符 语法 1.assignment-expression: conditional-expression unary-expression    assignment-operator     assignment-expression assignment-operator: 以下之一         =    *=    /=    %=    +=    -=    <<=    >>=    &=    ^=    |= 约束 2.一个赋值操作…
6.5.6 加法操作符 语法 1.additive-expression: multiplication-expression additive-expression    +    multiplication-expression additive-expression    -    multiplication-expression 约束 2.对于加法,要么操作数都应该具有算术类型,要么其中一个操作数应该是一个指向一个完整对象类型的指针,而另一个应该具有整数类型.(递增等价于加1.) 3…
6.5.1 基本表达式 语法 1.primary-expression: identifier constant string-literal (    expression    ) generic-selection 语义 2.一个标识符是一个基本表达式,提供为,它作为指派一个对象(在这种情况下,它是一个左值)或一个函数(在这种情况下,它是一个函数指派符)而被声明.[注:从而,一个未声明的标识符是对此语法的违反.][译者注:比如: ; a; // 这是一个基本表达式 ] 3.一个常量是一个基…
6.2.5 类型 1.存储在一个对象中的值或由一个函数所返回的值的意义由用于访问该对象的表达式的类型来确定.(声明为一个对象的一个标识符是最简单的这种表达式:其类型在标识符的声明中指定.)类型被划分为对象类型(描述对象的类型)以及函数类型(描述函数的类型).在一个翻译单元中的各个点上,一个对象类型可以是不完全的(缺乏足够信息来确定那个类型对象的大小)或完全的(具有充足的信息).[注:贯穿一整个翻译单元,一个类型可以是不完整的也可以是完整的,或者它可以在一个翻译单元的内的不同点来改变状态.] 2.…
6.3.1 算术操作数 6.3.1.1 布尔.字符以及整数 1.每个整数类型具有一个整数转换等级,如下定义: ——两个带符号的整数类型都不应该具有相同等级,即使它们具有相同的表示. ——一个带符号整数类型的等级应该比任一具有更低精度的带符号整数类型的等级要高. ——long long int的等级应该比long int的等级要高,而long int等级要比int等级要高,int要比short int等级要高,而short int要比signed char等级要高. ——任一无符号整数类型的等级应…
6.3.2 其它操作数 6.3.2.1 左值,数组,与函数指派符 1.一个左值是潜在地指派一个对象的一个表达式(具有一个对象类型,而不是void):[注:名字“左值”源自于赋值表达式E1 = E2,在此表达式中E1要求为一个(可修改的)左值.如果认作为表示一个对象“定位器值”可能更好.在此国际标准中描述为“一个表达式的值”有时也称为“右值”.一个左值的一个明显例子是一个对象的一个标识符.作为更进一步的例子,如果E是一个单目表达式,它是一个指向一个对象的指针,那么*E是一个指派E所指向对象的一个左…
1. 范围 1.本国际标准指定了C编程语言的形式并建立了对用C编程语言进行编写程序的诠释.[注:国际标准的设计是用于提升在多种数据处理系统中的C程序的可移植性.其目的在于能够被实现者与程序员所使用.]它指定了: ——C语言的表示: ——C语言的语法与强制规定: ——用于解释C程序的语义规则: ——由C程序进行处理的输入数据的表示 ——通过C程序所产生的输出数据的表示 ——遵循C实现的约束与限定. 2.本国际标准并不指定 ——C程序是通过什么机制进行变换而为一个数据处理系统所使用的: ——C程序是…
6.10.3 宏替换 约束 1.两个替换列表是相同的,当且仅当两个替换列表中的预处理符记都具有相同的数.次序.拼写,以及空白分隔符,这里所有的空白分隔符都认为是相同的. 2.当前被定义为一个类似对象的宏的标识符不应该被另一个#define预处理指示符重新定义,除非第二个定义是一个类似对象的宏定义,并且两个替换列表完全相同.类似的,当前被定义为类似函数的宏的标识符不应该用另一个#define预处理指示符重新定义,除非第二个定义是一个类似函数的宏定义,且具有相同个数的形参和拼写,以及两个替换列表完全…
6.10.2 源文件包含 约束 1.一个#include指示符应该指定一个能被实现处理的头文件或源文件. 语义 2.一个预处理指示符如下形式 #    include    <h-char-sequence>    new-line 搜索一个由实现定义的地方的序列,该地方用<和>分隔符之间所指定的序列唯一标识,并使得该指示符用头文件整个内容进行替换.这些地方如何指定或头文件标识符如何指定是由实现定义的. 3.一个预处理指示符的如下形式 #    include    "q…