6.5.4 一元运算符
6.5.4 一元运算符概览
一元表达式包括:
- 后缀表达式;
- 前置
++ - 前置
-- - 一元运算符作用于强制转换表达式
sizeof一元表达式sizeof(type-name)alignof(type-name)
一元运算符包括:
& * + - ~ !6.5.4.1 前置自增和前置自减
前置
++或--的操作数必须:- 具有原子的、限定的或无限定的实数类型或指针类型;
- 并且必须是可修改左值。
++E会先把操作数值加一,然后表达式结果就是更新后的新值。它等价于:
E += 1其中 1 的类型取适当类型。
--E与之类似,只是把值减一。
NOTE
前置形式返回的是“修改后的值”;后置形式返回的是“修改前的旧值”。两者不要混。
6.5.4.2 取地址和间接访问
一元
&的操作数必须是以下之一:- 函数设计符;
[]运算符的结果;- 一元
*运算符的结果; - 或某个指代对象的左值,且该对象不是位字段,也不是用
register存储类声明的。
一元
*的操作数必须是指针类型。对对象或函数应用
&,结果是指向该对象或函数的指针。若对
*的结果再取地址,或者对&的结果再解引用,在满足约束的前提下会相互抵消。对空指针、无效指针或越界指针执行间接访问,行为未定义。
&*E与E在满足约束时等价;&(E1[E2])也等价于(E1) + (E2)。不过这里说的是语义等价,不表示中间真的会先做一次解引用。
6.5.4.3 一元算术运算符与逻辑非
一元
+的操作数必须是算术类型;结果就是操作数经过整数提升后的值。一元
-的操作数也必须是算术类型;结果是该值的算术相反数。对无符号类型,这会按该类型规则发生回绕。一元
~的操作数必须是整数类型;在整数提升之后,对其各位逐位取反。一元
!的操作数必须是标量类型;若操作数与0比较相等,则结果为1,否则结果为0。结果类型是int。
WARNING
~ 不是“逻辑非”,而是按位取反;! 才是逻辑非。
6.5.4.4 sizeof 与 alignof
sizeof用于给出对象表示的大小,结果类型是size_t。alignof用于给出完整类型的对齐要求,结果类型同样是size_t。sizeof的操作数可以是表达式,也可以是类型名;alignof的操作数是类型名。对大多数表达式形式的
sizeof,操作数不会被求值;但若操作数类型是可变修改类型,则相关大小求值仍可能发生。sizeof不能用于函数类型、不完整类型,也不能用于位字段结果。对数组类型使用
sizeof,得到的是整个数组的大小,不是指针大小。
IMPORTANT
sizeof arr 与 sizeof p 经常被混淆。前者在 arr 仍是数组时给出整个数组大小,后者只是指针对象本身的大小。
标准里的常见用途
sizeof array / sizeof array[0]这是一种常见写法,用来求数组元素个数。