跳转到内容

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