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。]

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

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

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

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

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

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

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

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

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

  5. ISO/IEC 9899:2011 条款6.7.9——初始化

    6.7.9 初始化 语法 1.initializer: assignment-expression {    initializer-list    } {    initializer-list   ...

  6. ISO/IEC 9899:2011 条款6.7.6——声明符

    6.7.6 声明符 语法 1.declarator: pointeropt    direct-declarator direct-declarator: identifier (    declar ...

  7. ISO/IEC 9899:2011 条款5——5.2.4 环境限制

    5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执 ...

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

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

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

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

随机推荐

  1. 51nod 2488 矩形并的面积

    在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积.即它们重叠在一起的总的面积. 收起   输入 8个数,分别表示第一个矩形左下角坐标为(A,B),右上角坐标为(C ...

  2. python 字符串操作list[::-1]的几种用法

    1.list[-1],此时只有一个参数,作用是通过下标访问数据,-1是倒数第一个. 2.list[:-1],作用是返回从start_index = 0到end_index = -1的一串数据这里的li ...

  3. js比较日期大小 判断日期

    使用js的方法来判断两个日期的先后关系,不能正常判断,因此手写了一个方法,如下: //判断开始日期是否大于结束日期,注意,该方法仅仅适用于“2010-01-01”这样的日期格式!   function ...

  4. maven项目重构-使用了mybatis generator插件

    1.在worksapce下,dos窗口输入spring init -g=com.briup.apps -a=poll3 -d=mysql,mybatis,web poll3 2.下载依赖,cd到pol ...

  5. 第二章--MYSQL体系结构和管理

    体系结构 MySQL C/S模型 Server : mysqld Client : socket:仅本地连接使用 tcp/ip:应用连接使用(远程和本地) #TCP/IP方式(远程.本地) mysql ...

  6. (尚015)Vue过滤器(对显示的数据进行格式化)

    现在日期为:当前时间-1970年1月1日0时0分0秒的时间差 日期格式化:百度搜索moment 1.test015.html <!DOCTYPE html><html lang=&q ...

  7. bzoj 2969: 矩形粉刷 概率期望+快速幂

    还是老套路:期望图上的格子数=$\sum$ 每个格子被涂上的期望=$\sum$1-格子不被图上的概率 这样的话就相对好算了. 那么,对于 $(i,j)$ 来说,讨论一下上,下,左,右即可. 然后发现四 ...

  8. (18)打鸡儿教你Vue.js

    介绍一下怎么安装Vue.js vue.js Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性. Vue.js是一个渐进的,可逐步采用的Jav ...

  9. FCS省选模拟赛 Day1

    Description  Solution T1 shopping 目测是插板法乱搞一下 发现题解写的是容斥dp: \[ ans = \sum_i (-1)^ig[i] \] \(g[i]\)表示的有 ...

  10. 无旋Treap模板

    传送门 Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) # ...