6.3.2 其它操作数

6.3.2.1 左值,数组,与函数指派符

1、一个左值是潜在地指派一个对象的一个表达式(具有一个对象类型,而不是void);[注:名字“左值”源自于赋值表达式E1 = E2,在此表达式中E1要求为一个(可修改的)左值。如果认作为表示一个对象“定位器值”可能更好。在此国际标准中描述为“一个表达式的值”有时也称为“右值”。一个左值的一个明显例子是一个对象的一个标识符。作为更进一步的例子,如果E是一个单目表达式,它是一个指向一个对象的指针,那么*E是一个指派E所指向对象的一个左值。]如果一个左值当它被计算时并不指派一个对象,那么行为是未定义的。当一个对象被称为具有一个特定类型时,该类型由用于指派该对象的左值指定。一个可修改的左值是一个不具有数组类型、不具有一个不完整类型、不具有一个const限定类型的左值,并且如果该左值是一个结构体或联合体,那么它不具有带有一个const限定类型的任一成员(递归地包括所有所包含的聚合或联合体的任一成员或元素)。

2、除了当一个左值是sizeof操作符、_Alignof操作符、单目&操作符、++操作符、--操作符的操作数的操作数时,或者是.操作符或赋值操作符的左操作数时,一个不具有数组类型的左值被转换为被指派对象中所存储的值(并且不再是一个左值);这被称为左值转换。如果左值具有限定类型,那么转换后的值具有该左值类型的非限定版本;此外,如果左值具有原子类型,那么转换后的值具有该左值类型的非原子版本;否则,该值具有左值类型。如果左值具有一个不完整类型并且不具有数组类型,那么行为是未定义的。如果左值指派了自动存储周期的一个对象,该对象可能用register存储类说明符来声明(从不取其地址),并且该对象未被初始化(没有用一个初始化器来声明并且在使用之前没有对它赋值),那么行为是未定义的。

3、除了当一个表达式是作为sizeof操作符、_Alignof操作符或单目&操作符的操作数时,或用于初始化一个数组的一个字符串字面量时,具有“类型的数组”类型的一个表达式被转换为具有“指向类型的指针”类型的一个表达式,该表达式指向数组对象的首个元素,并且不是一个左值。如果该数组对象具有寄存器存储类,那么行为是未定义的。

4、一个函数指派符是一个具有函数类型的表达式。除了当它是sizeof操作符、_Alignof操作符[注:因为这个转换不会发生,所以sizeof_Alignof操作符的操作数仍然是一个函数指派符并违反了6.5.3.4的约束。],或单目&操作符的操作数时,一个具有类型“函数返回类型”的函数指派符被转换为一个表达式,该表达式具有“指向函数返回类型的指针”类型。[译者注:在C语言中,一个函数指派符为一个函数的标识符,用于表明一个函数类型。这段话中表明了,一个函数标识符在它不作为sizeof或_Alignof的操作数时,被转换为一个函数指针类型。如一下代码:

void FunA(void)
{ } int main(void)
{
size_t size = sizeof(FunA); // FunA为函数类型,非法
size = _Alignof(FunA); // FunA为函数类型,非法 size = sizeof(&FunA); // (&FunA)为函数指针类型,合法
size = _Alignof(&FunA); // (&FunA)为函数指针类型,合法 void (*pFunc)(void) = FunA; // 这里的FunA具有函数指针类型
}

上述代码中,main函数里出现的FunA均为函数指派符。另外,现在大部分C语言编译器对于sizeof操作符以及_Alignof操作符里面所包含的函数指派符,仍然作为函数指针类型,尽管这并非严格遵从C语言标准。

]

6.3.2.2 void

1、一个void表达式(具有void类型的一个表达式)的(不存在的)值不应该以任一种方法被使用,并且隐式的或显式的转换(除了对void的转换)不应该被应用到这样的一个表达式上。如果任一其它类型的一个表达式被计算出为一个void表达式,那么其值或指派符被丢弃。(一个void表达式为其副作用而被计算。)

6.3.2.3 指针

1、一个指向void的指针可以被转换为指向任一对象类型的指针;也能从指向任一对象类型的指针转换为指向void的指针。一个指向任一对象类型的指针可以被转换回为一个指向void的指针;结果与原始指针相比较应该相等。

2、对于任一限定符q,一个指向非q限定的类型可以被转换为一个指向该类型的q限定版本;在原始对象中所存储的值与转换后的指针所指向对象的值比较应该相等。

3、一个带有0值的整数常量表达式,或被投射到类型void*的这么一个表达式,被称为一个空指针常量。[注:NULL宏被定义在<stddef.h>中(以及在其它头文件中)作为一个空指针常量;见7.19。]如果一个空指针常量被转换为一个指针类型,那么结果指针被称为一个空指针,空指针与一个指向任一对象或函数的指针比较必定不相等。

4、一个空指针到另一个指针类型的转换产生一个那个类型的空指针。任何两个空指针比较应该相等。

5、一个整数可以被转换为任一指针类型。除了作为先前所指定的,该结果是由实现定义的,可能不会被正确对齐,可能不指向一个被引用类型的实体,并且可能是一个陷阱表示。[注:对于将一个指针转换为一个整数或将一个整数转换为一个指针的映射函数,目的在于与执行环境的寻址结构相一致。]

6、任一指针类型可以被转换为一个整数类型。除了作为先前所指定的,该结果是实现定义的。如果结果不能用那个整数类型来表示,那么行为是未定义的。结果不需要在任一整数类型的范围之内。

7、一个指向一个对象类型的一个指针可以被转换为指向一个不同对象类型的一个指针。如果该结果指针没有对那个被引用类型正确地对齐[注:一般来说,“正确地对齐”的概念是可传递的:如果一个类型A的指针被正确对齐到一个类型B的指针,而类型B的指针正确对齐到类型C的指针,那么一个指向类型A的指针也被正确地对齐到类型C的指针。],那么行为是未定义的。否则,当再次转换回时,结果应该与原始指针比较相等。当一个指向对象的指针被转换为指向一个字符类型指针时,结果指向该对象的最低编址的字节。结果的相继递增,到达对象的尺寸,产生对该对象剩余字节字节的指针。

8、一个指向一个类型的函数的指针可以被转换为指向一个另一类型的函数的指针,并且再转换回来;结果与原始指针比较应该相等。如果一个被转换的指针被用于调用一个函数,其类型与被引用类型不兼容,那么行为是未定义的。

ISO/IEC 9899:2011 条款6.3.2——其它操作数的更多相关文章

  1. ISO/IEC 9899:2011 条款6.3.1——算术操作数

    6.3.1 算术操作数 6.3.1.1 布尔.字符以及整数 1.每个整数类型具有一个整数转换等级,如下定义: ——两个带符号的整数类型都不应该具有相同等级,即使它们具有相同的表示. ——一个带符号整数 ...

  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.4.2——标识符

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

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

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

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

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

  7. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

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

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

  9. ISO/IEC 9899:2011 条款6.3——转换

    6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...

随机推荐

  1. linux----centos7 yum安装lnmp+zabbix

    安装yum utils工具包,若不安装则会找不到命令yum-config-manageryum -y install yum-utils 启用yum仓库yum-config-manager --ena ...

  2. HTML&CSS基础-ps的基本操作

    HTML&CSS基础-ps的基本操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   我们工作中可能会经常需要将一个图片做成一个网页,而图片中的字体大小,行间距,图中lo ...

  3. ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

    pip install imagededup 时,报错:Cannot uninstall 'wrapt'. It is a distutils installed project and thus w ...

  4. charles 手机证书下载安装

    本文参考:charles 手机证书下载安装 本文的Charles,适应windows/MAC/IOS/Android,避免抓包HTTPS失败和乱码: 用的版本是V4.1.2,其它版本原理类似: cha ...

  5. ubuntu---记录.动态库默认路径的踩坑

    发现这个问题,还是经过一个报错问题卡了好多天,然后请求好多人的支援,最后个人的疑问:为什么明明指明了路径,生成 .SO 没有问题,在调用.SO 就有问题,报错各种找不到函数或者未定义,然后把缺的 *. ...

  6. export default 和 export 的使用方式

    node中导入模块:var 名称 = require('模块标识符') node中向外暴露成员的形式:module.exports = {} 在ES6中,也通过规范的形式,规定了ES6中如何导入和导出 ...

  7. 优化你的HTTPS(下),你需要这么做

    本篇文章是接着上篇文章来说,这篇介绍三种方法分别是多路复用 ,请求优先级,服务器推送. 多路复用 请求优先级 服务器推送 多路复用 在HTTP1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一 ...

  8. php MySQL 数据类型

    MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准S ...

  9. LibreOJ #6217. 扑克牌

    二次联通门 : LibreOJ #6217. 扑克牌 /* LibreOJ #6217. 扑克牌 背包.... 回到家之后简直了...sb题想半天 */ #include <cstdio> ...

  10. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...