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. CF: Long Number

                                                    题目链接 #include<iostream> #include<string> ...

  2. CentOS7使用阿里yum源安装Docker

    yum install -y yum-utils device-mapper-persistent-data lvm2安装所需的包 # yum-config-manager --add-repo ht ...

  3. JDK源码那些事儿之LinkedTransferQueue

    在JDK8的阻塞队列实现中还有两个未进行说明,今天继续对其中的一个阻塞队列LinkedTransferQueue进行源码分析,如果之前的队列分析已经让你对阻塞队列有了一定的了解,相信本文要讲解的Lin ...

  4. 神经网络(11)--具体实现:unrolling parameters

    我们需要将parameters从矩阵unrolling到向量,这样我们就可以使用adanced optimization routines. unroll into vectors costFunct ...

  5. pl/sql developer 中文字段显示乱码 解决办法

    一.原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二.查看和修改oracle数据库字符集: select userenv('language') from d ...

  6. 题解 UVa10780

    题目大意 多组数据,每组数据给定两个整数 \(m,n\),输出使 \(n\%m^k=0\) 的最大的 \(k\).如果 \(k=0\) 则输出Impossible to divide. 分析 计数水题 ...

  7. php 数组的计算

    数组是我们最常用到的类型,那如何计算某个一维数组的个数呢.其实我们可以用到我们之前学过的数学函数里面的一个:count(). 我们来看看count函数的用法: int count ( mixed $变 ...

  8. QMutexLocker基于QMutex的便利类

    首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义   私有成员变量  和  全局变量,只能够定义局部变量来使用. 使用方法:(1)先定义一个QMutex类的 ...

  9. Code Chef October Challenge 2019题解

    传送门 \(MSV\) 设个阈值搞一搞就行了 //quming #include<bits/stdc++.h> #define R register #define pb emplace_ ...

  10. 像素迷踪,当Unity的Frame Debugger力不从心时

    http://www.manew.com/thread-92382-1-1.html 从版本5开始,Unity包含了一个全新的可视化帧调试工具,Frame Debugger.该工具能帮你解决很多图形方 ...