ISO/IEC 9899:2011 条款6.5.3——单目操作符
6.5.3 单目操作符
语法
1、unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-expression cast-expression
sizeof unary-expression
sizeof ( type-name )
_Alignof ( type-name )
unary-operator: 以下之一
& * + - ~ !
6.5.3.1 前缀递增与递减操作符
约束
1、前缀递增或递减操作符的操作数应该具有原子、限定、或非限定的实数或指针类型,并且应该是一个可修改的左值。
语义
2、前缀++操作符的操作数的值被递增。结果是在递增后操作数的新的值。表达式 ++E 等价于 (E += 1)。见加法操作符与复合赋值信息上的约束、类型、副作用以及转换和对指针操作影响的讨论。
3、前缀--操作符类似于前缀++操作符,除了操作数的值是递减的。
6.5.3.2 地址与间接操作符
约束
1、单目 & 操作符的操作数应该要么是一个函数指派符, [] 或单目 * 操作符的结果,要么是指派一个对象的左值,该对象不是一个位域,且不以register存储类说明符来声明。
2、单目 * 操作符的操作数应该具有指针类型。
语义
3、单目 & 操作符产生了其操作数的地址。如果该操作数具有类型“type”,那么结果是类型“指向type的指针”。如果操作数是一个单目 * 操作符,那么 * 操作符与 & 操作符都不会被计算,并且结果就好比两个操作符都被忽略一样,除了对操作符的约束仍然应用,以及结果也不是一个左值。类似地,过操作数是一个 [] 操作符的结果,那么 & 操作符与被 [] 指示的单目 * 操作符都不被计算,并且结果就好比& 操作符被移除,且 [] 操作符被变为一个 + 操作符。否则,结果是指向该对象或由其操作数所指派的函数的一个指针。
4、单目 * 操作符表示了间接操作。如果操作数指向一个函数,那么结果是一个函数指派符;如果它指向了一个对象,那么结果是一个指派该对象的一个左值。如果操作数具有“指向type的指针”,那么结果具有类型“type”。如果一个无效的表达式被赋给了该指针,那么单目 * 操作符的行为是未定义的。[注:从而,&*E 等价于E(即使E是一个空指针),以及 &(E1[E2]) 等价于 ((E1) + (E2))。如果E是一个函数指派符或是单目 & 操作符的一个有效操作数的一个左值,那么 *&E 是一个函数指派符或等价于E的一个左值。如果 *P 是一个左值,且T是一个对象指针类型的名称,那么 *(T)P 是一个具有兼容于T所指向对象的类型的一个左值。对于通过一个单目 * 操作符做解引用的无效值之中,可能是一个空指针、一个不恰当对齐的指向对象类型的地址,以及在其生命周期结束之后的一个对象的地址。]
6.5.3.4 sizeof与_Alignof操作符
约束
1、sizeof操作符不应该应用于具有函数类型或一个不完整类型的一个表达式,也不能应用于用圆括号括起来的这么一个类型,以及不能应用于指派一个位域成员的一个表达式。_Alignof操作符不应该应用于一个函数类型或一个不完整类型。
语义
2、sizeof 操作符产生其操作数的大小(按字节计算),这可以是一个表达式或用圆括号括起来的一个类型名。该大小由其操作数的类型确定。结果是一个整数。如果操作数的类型是一个变长数组类型,那么该该操作数被计算;否则,操作数不被计算,并且结果是一个整数常量。
3、_Alignof操作符产生其操作数类型的对齐要求。该操作数不被计算,并且结果是一个整数常量。当应用于一个数组类型时,该结果是该元素类型的对齐要求。
4、当sizeof被应用于具有char、unsigned char、或signed char类型的一个操作数时,(或上述的一个限定版本)那么结果为1。当应用于一个具有数组类型的一个操作数时,那么结果是数组中字节总数的结果。[注:当应用于一个声明为具有数组或函数类型的一个形参时,sizeof操作符产生调整后的(指针)类型(见6.9.1)]当应用于一个具有结构体或联合体类型的一个操作数时,结果是这么一个对象中的字节总数,包括内部以及尾随的填充。
5、两个操作符的结果值都是实现定义的,并且其类型(一个无符号整数类型)为size_t,定义在<stddef.h>中(以及其它头文件中)。
6、例1 对sizeof操作符的一个基本使用是与诸如存储分配以及I/O系统进行通信的。一个存储分配的函数可能接受一个对象的大小(以字节计算)来分配并返回一个指向void的指针。比如:
extern void *alloc(size_t);
double *dp = alloc(sizeof *dp);
alloc函数的实现应该确保其返回值适当地对于,用于指向double的指针转换。
7、例2 sizeof操作符的另一种使用是计算一个数组中元素个数:
sizeof array / sizeof array[]
8、例3 在本例子中,一个变长数组的大小被计算并从一个函数返回:
#include <stddef.h> size_t fsize3(int n)
{
char b[n + ]; // 变长数组
return sizeof b; // 执行时sizeof
} int main(void)
{
size_t size;
size = fsize3(); // fsize3返回13
return ;
}
ISO/IEC 9899:2011 条款6.5.3——单目操作符的更多相关文章
- ISO/IEC 9899:2011 条款6.5.10——按位与操作符
6.5.10 按位与操作符 语法 1.AND-expression: equality-expression AND-expression equality-expression 约束 2.这些 ...
- ISO/IEC 9899:2011 条款6.5——表达式
6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...
- ISO/IEC 9899:2011 条款6.5.6——加法操作符
6.5.6 加法操作符 语法 1.additive-expression: multiplication-expression additive-expression + multipli ...
- ISO/IEC 9899:2011 条款6.3.1——算术操作数
6.3.1 算术操作数 6.3.1.1 布尔.字符以及整数 1.每个整数类型具有一个整数转换等级,如下定义: ——两个带符号的整数类型都不应该具有相同等级,即使它们具有相同的表示. ——一个带符号整数 ...
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- ISO/IEC 9899:2011 条款6.4.3——通用字符名
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
随机推荐
- JVM垃圾回收重要理论剖析【纯理论】
JVM学习到这里,终于到学习最兴奋的地方了---垃圾回收,在学习它之前还得对JVM垃圾回收相关理论知识进行了解,然后再通过实践来加深对理论的理解,下面直接开始了解相关的理论: JVM运行时内存数据区域 ...
- dt二次开发之-地区链接伪静态标签用法
用法:开启伪静态功能,参照前台,看看哪里有按照地区浏览,然后打开对应的模块和模板,修改 <a href="{$MOD[linkurl]}search.php?areaid={$v[ar ...
- Apache Kylin在美团点评的应用
本文原载自大数据杂谈微信公众号. 感谢美团点评工程师高大月撰文并授权转载. 高大月,美团点评工程师,Apache Kylin PMC成员,目前主要在美团点评数据平台负责OLAP查询引擎的建设. 背 ...
- windows下命令行切换目录
1.切换目录 C:\Users\MACHENIKE> cd H:/www C:\Users\MACHENIKE>H: H:\www> 2.查看目录文件 H:\www>dir
- 第三节.vue.js属性与方法
1. <!DOCTYPE html><html><head><meta charset="UTF-8"><title>I ...
- 在Modelsim中使用dsp 48e进行仿真
在Modelsim中使用DSP 48E仿真时,需要用到glbl模块,它的调用方法如下所示: vlog -incr GND.v VCC.v FDRE.v DSP48E.vvlog -incr glbl. ...
- Codeforces 1137F Matches Are Not a Child's Play [LCT]
Codeforces 很好,通过这题对LCT的理解又深了一层. 思路 (有人说这是套路题,然而我没有见过/kk) 首先发现,删点可以从根那里往下删,非常难受,所以把权值最大的点提为根. 然后考虑\(x ...
- [golang] 抓包注入分析
视频信息 Packet Capture, Analysis, and Injection with Goby John Leonat GopherCon 2016 https://www.youtub ...
- UDP 区别于 TCP 的特点
TCP 我们了解得多了,所以今天我们站在 UDP 的角度,探讨一下 UDP 区别于 TCP 的特点. 1. 面向无连接 UDP 比 TCP 简单得多,不需要“三次握手”来建立连接,直接把内容发送出去. ...
- Sublime Text 3 import Anaconda 无法正常补全模块名解决办法
Sublime Text 3 Anaconda配置 在安装Sublime Text3之后我们总会安装一些插件,比如Python的Anaconda自动补全插件.但是,装好之后发现import 时无法像别 ...