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函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
随机推荐
- Python开发笔记之-字符串函数
1.首字母大写 >>> s = 'yuanzhumuban' >>> s.capitalize() 'yuanzhumuban' 2.replace,替换 > ...
- (转载) SQL Server AG集群启动不起来的临时自救大招
背景 前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群 结果重启WSFC集群之后,非但没有好转,导致整个AG无法启动,主副本和辅助副本都处于正在解析的状态 ...
- bg/fg/jobs
用于将某个任务放置后台运行,一般会与 ctrl+ z , fg, & 符号联用. 典型的场景就是将耗时的任务放于后台运行,例如打包某个占用空间大的目录,
- word collocations中文版(信息检索)
虽然说是大作业,也做了好几天,但是完全没有什么实际价值...就是把现有的东西东拼西凑一下,发现跑的特别慢还搞了个多核 写这篇blog纯属是我吃饱了没事干,记录一下装env的蛋疼 首先我们是在pytho ...
- I9300 国行联通定制修复手记
同事拿来个I9300给我修,说是打不了电话,试了一下,打电话的时候会提示“网络未注册”,于是果断找了个国行的4.1.2五件套刷砖.5分钟后,刷机成功,开机拨号,依旧是这个问题,怎么回事呢?上百度一查, ...
- (14)打鸡儿教你Vue.js
重构 "代码重构" 为什么要进行重构 提高代码的可读性和可维护性 代码中存在着重复的代码 存在过大的类或过长的方法 强依赖.紧耦合的结构 运算逻辑难以理解 代码不能清晰 统一的编码 ...
- [golang]A modern, fast and scalable websocket framework with elegant API written in Go
A modern, fast and scalable websocket framework with elegant API written in Go http://bit.ly/neffos- ...
- js将数组分割成等长数组
方法一: function group(array, subGroupLength) { let index = 0; let newArray = []; while(index < arra ...
- Pytest权威教程21-API参考-04-钩子(Hooks)
目录 钩子(Hooks) 引导时的Hook方法 初始化时的Hook方法 测试运行时的Hook方法 收集用例时的Hook方法 生成测试结果时的Hook方法 调试/交互Hook方法 返回: Pytest权 ...
- PHP rtrim() 函数
code <!DOCTYPE html> <html> <body> <?php $str = "Hello World!"; echo ...