6.6 常量表达式

语法

1、constant-expression

conditional-expression

描述

2、一个常量表达式可以在翻译期间被计算,而不是在运行时,并且根据情况可以被用于任一能够做为常量的地方。

约束

3、常量表达式不应该包含赋值、递增、递减、函数调用或逗号操作符,除了当它们包含在一个不被计算的子表达式中时。[注:sizeof_Alignof操作符的操作数通常不被计算(6.5.3.4)。]

4、每个常量表达式应该对一个常量进行计算,该常量在其类型可表示的值的范围内。

语义

5、对一个常量计算的一个表达式需要在几个上下文中。如果一个浮点表达式在翻译单元中被计算,那么算术范围与精度应该至少与表达式在执行环境中计算的一样大。[注:计算格式的使用由FLT_EVAL_METHOD来表示,这也应用于在翻译环境中的计算。]

6、一个整数常量表达式[注:一个整数常量表达式需要在一些上下文中,诸如一个结构体的一个位域成员的大小、一个枚举常量的值、一个非可变大小数组的大小。此外,应用于在条件包含预处理指示符中的整数常量表达式的约束在6.10.1中讨论。]应该具有整数类型,并且应该只具有以下这些操作数:整数常量、枚举常量、字符常量、sizeof表达式(其结果为整数常量)、_Alignof表达式,以及浮点常量(其为投射操作的立即操作数)。在一个整数常量表达式中的投射操作应该只是将算术类型转换为整数类型,除了作为sizeof_Alignof操作符的一个操作数的一部分之外。

7、对于用于初始化器中的常量表达式所允许的范围更大。这么一个常量表达式应该是,或等价于下列之一:

——一个算术常量表达式,

——一个空指针常量,

——一个地址常量,或

——用于一个完整对象类型的一个地址常量,加或减一个整数常量表达式。

8、一个算术常量表达式应该具有算术类型并且应该只具有整数常量、浮点常量、枚举常量、字符常量、结果为整数常量的sizeof表达式、以及_Alignof表达式的操作数。在算术常量表达式中的投射操作符应该只将算术类型转换为算术类型,除了作为sizeof_Alignof操作符的一个操作数的某一部分。

9、一个地址常量是一个空指针、一个指向指派一个静态存储周期对象的左值、或是指向一个函数指派符的一个指针;它应该使用单目 & 操作符或投射到指针类型的一个整数常量被显式创建,或是通过使用一个数组或函数类型的表达式来隐式创建。数组下标 [] 与成员访问 .-> 操作符、地址 & 与 * 单目操作符,以及指针投射可以被用于一个地址常量的创建中,但是一个对象的值不应该被这些操作符的使用所访问。

10、一个实现可以访问常量表达式的其它形式。

11、对于计算一个常量表达式的语义规则与对非常量表达式的是相同的。[注:从而,在以下初始化中:

static int i =  || i / ;

该表达式是一个有效的常量表达式,值为1。[译者注:该表达式相当于:static int i = (2) || (i / 0); 由于(2)这个子表达式已经说明 || 的操作结果为真,因此不会后续的(i / 0),所以整个结果即为1。]

最新文章

  1. 烂泥:CentOS命令学习之tar打包与解压
  2. 初识JNI
  3. dedecms /member/pm.php SQL Injection Vul
  4. 允许webservice远程测试
  5. myeclipse/eclipse没有Project Facets的解决方法
  6. WebKit内核分析之Page
  7. android 项目学习随笔九(ListView加头布局)
  8. c语言分析函数调用关系图(call graph)的几种方法
  9. 安装使用adobe_photoshop_cs6
  10. HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树
  11. 【Golang笔记】Golang工具包Cobra安装记录
  12. ios同步线程(dispatch_sync)保证代码在主线程中执行
  13. Binary Tree HDU - 5573 (思维)
  14. AppUtil
  15. jQuery validator plugin 之 custom methods 案例1:multi email
  16. python:a+=b 和a=a+b? 基础数据类型也不能乱用
  17. PHP查看内存使用
  18. 3月23 格式布局及relative
  19. OpenStack的架构详解[精51cto]
  20. centos 7 安装jira 破解

热门文章

  1. P1559 运动员最佳匹配问题[最大费用最大流]
  2. CH6801 棋盘覆盖
  3. LINQ查询表达式(1) - 查询表达式基础
  4. SQL SERVER使用 CROSS APPLY 与 OUTER APPLY 连接查询
  5. Java实现数组元素反转
  6. 记下mongoose(转载)
  7. pyy整队 线段树
  8. 洛谷P1706全排列问题
  9. centos host-only网卡配置
  10. linux 查看文件内容的几种命令