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
类型不能进行自减运算。