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——单目操作符的更多相关文章

  1. ISO/IEC 9899:2011 条款6.5.10——按位与操作符

    6.5.10 按位与操作符 语法 1.AND-expression: equality-expression AND-expression    equality-expression 约束 2.这些 ...

  2. ISO/IEC 9899:2011 条款6.5——表达式

    6.5 表达式 1.一个表达式是操作符与操作数的一个序列,这些操作符与操作数指定了一个值的计算,或指派一个对象或一个函数,或是生成副作用,或执行上述操作的组合.对一个操作符的操作数的值计算顺序排在对该 ...

  3. ISO/IEC 9899:2011 条款6.5.6——加法操作符

    6.5.6 加法操作符 语法 1.additive-expression: multiplication-expression additive-expression    +    multipli ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 微信小程序~生命周期方法详解

    生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...

  2. 51nod 2499 不降的数字

    小b有一个非负整数 N,她想请你找出 ≤N≤N 的最大整数x,满足x各个位数上的数字是不降的.也就是说,设x的十进制表示为 a1,a2,…,ama1,a2,…,am,则对于任意 1≤i<m1≤i ...

  3. 《你说对就队》第八次团队作业:Alpha冲刺 第三天

    <你说对就队>第八次团队作业:Alpha冲刺 第三天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...

  4. test20190829 神大校赛模拟

    100+100+0=200,聪明搬题人题面又出锅了. 最短路径(path) 给定有向图,包含 n 个节点和 m 条有向边. 一条A 到 B 的路径是最短路径当且仅当不存在另一条从A 到 B 的路径比它 ...

  5. test20190827 NOIP2019 模拟赛

    100+100+50=250.最后那道期望题需要用另外的方式统计. 精灵加护 ljss 被 M 个敌人打倒在地上啦!每个敌人有一个威力值 bi.但是他手中还拥有 N 把武器!每把武器有一个威力值 ai ...

  6. TJOI2016 字符串

    字符串 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱子拿到礼物,升职 ...

  7. 无向图的割点和桥 tarjan 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 20005; const int MAXM = 100005; ...

  8. Logparser

    http://www.microsoft.com/en-us/download/details.aspx?id=24659 Logparser 的用法 https://www.cnblogs.com/ ...

  9. 面对对大体量矢量数据ArcGIS的优化方法

    大数据量矢量数据的可视化需要解决的问题,就是如何在可接受的短时间内,能展示大数据量的矢量地图. 解决方案一:采用预先渲染的切片进行展示 切片是预先渲染的数据集,也是响应最快的展示方式.目前ArcGIS ...

  10. P2016 战略游戏——树形DP大水题

    P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...