2.2.4 一元表达式
一元表达式有很多种,这里暂时只介绍其中两种与算术相关的表达式:正运算符和负运算符表达式。其形式为:
- + 一元表达式
- - 一元表达式
- ~ 一元表达式
- ! 一元表达式
- ++ 一元表达式
- -- 一元表达式
- 后缀表达式
其中 + 表示正运算符,- 表示负运算符,~ 表示按位取反,! 表示逻辑非,++ 表示前缀自增运算符,-- 表示前缀自减运算符。
更多一元表达式
技术性地说,一元表达式形式应当是 + 转换表达式、- 转换表达式、后缀表达式等。后缀表达式 又由函数调用、数组访问、基本表达式等组成。
这里为了方便理解,对一元表达式的形式做出了简化,只介绍了一元表达式的一部分。
正运算符
目前我们只考虑 int、bool、char 这三种基本类型的运算。
对于 int,正运算符的作用是得到操作数的值。例如:
+42 // 值为 42注意,+a这个表达式虽然值和 a 一样,但是 +a 不同与 a,不再指代 a 所代表的对象,而是另一个和 a 相同的值。
正运算符会进行整数提升。例如:
+true // 值为 1
+false // 值为 0
+'a' // 值为 97负运算符
负运算符的作用是得到操作数的相反数。例如:
-42 // 值为 -42负运算符的作用和正运算符类似,同样会进行整数提升。例如:
-true // 值为 -1
-false // 值为 0
-'a' // 值为 -97此外,-a 表达式的值和 a 的值相反,但是类似与 +a 并不指代 a 这个对象,-a 并不会改变 a 的值。
按位取反
按位取反运算符的作用是对操作数的每一位取反。例如:
~42 // 值为 -43假设 int 类型是32位的,42 的二进制表示是0000 0000 0000 0000 0000 0000 0010 1010,取反后的二进制表示是1111 1111 1111 1111 1111 1111 1101 0101,转换为十进制就是-43。
类似于正运算符和负运算符,按位取反运算符也会进行整数提升。例如:
~true // 值为 -2
~false // 值为 -1
~'a' // 值为 -98逻辑非
逻辑非运算符的作用是对操作数取逻辑非,例如:
!42 // 值为 0逻辑非期待一个 bool 类型的值进行运算,所以这里 42 被转换为 true,然后取逻辑非,结果是 false。
前缀自增运算符
前缀自增运算符的作用是将操作数表示的对象加一,表达式的值是这个对象加一之后的值、且表示这个对象。例如:
int a = 10;
++a // 表达式 ++a 的值是 11,a 的值变为 11注意, bool 类型不能进行自增运算。
前缀自减运算符
前缀自减运算符的作用是将操作数表示的对象减一,表达式的值是这个对象减一之后的值、且表示这个对象。例如:
int a = 10;
--a // 表达式 --a 的值是 9,a 的值变为 9注意, bool 类型不能进行自减运算。