操作符
操作符就是告诉编译器来执行数学或逻辑运算操作的符号。C++ 有非常丰富的内置操作符。提供如下几类的操作符:
- 数学运算操作符
- 关系运算操作符
- 逻辑运算操作符
- 位运算操作符
- 赋值运算操作符
- 复合运算操作符
下面的章节将一一介绍数学、关系、逻辑、位运算、赋值和其他操作符。
数学运算操作符
下面的就是 C++ 语言所支持的数学运算操作符:
假设变量 A 存储 10,变量 B 存储 20,那么:
| 运算符 | 描述 | 例子 | 
|---|---|---|
| + | 两个运算数相加 | A + B = 30 | 
| - | 第一个运算数减去第二个运算数 | A - B = -10 | 
| * | 运算数相乘 | A * B = 200 | 
| / | 分子除以分母 | B / A = 2 | 
| % | 模数运算符,整除后的余数 | B % A = 0 | 
| ++ | 增量运算符,整数值逐次加1 | A++ = 11 | 
| -- | 减量运算符,整数值逐次减1 | A-- = 9 | 
关系运算符
下面的就是 C++语言所支持的关系运算操作符:
假设变量 A 存储 10,变量 B 存储 20,那么:
| 运算符 | 描述 | 例子 | 
|---|---|---|
| == | 检查两个运算数的值是否相等,如果是,则结果为 true | A == B 为 false | 
| != | 检查两个运算数的值是否相等,如果不相等,则结果为 true | A != B 为 true | 
| > | 检查左边运算数是否大于右边运算数,如果是,则结果为 true | A > B 为 false | 
| < | 检查左边运算数是否小于右边运算数,如果是,则结果为 true | A < B 为 true | 
| >= | 检查左边运算数是否大于或者等于右边运算数,如果是,则结果为 true | A >= B 为 false | 
| <= | 检查左边运算数是否小于或者等于运算数,如果是,则结果为 true | A <= B 为 true | 
逻辑运算符
下面的就是 C++语言所支持的逻辑运算操作符:
假设变量 A 存储 1,变量 B 存储 0,那么:
| 运算符 | 描述 | 例子 | 
|---|---|---|
| && | 称为逻辑与运算符。如果两个运算数都非零,则结果为 true。 | A && B 为 true | 
| || | 称为逻辑或运算符。如果两个运算数中任何一个非零,则结果为 true。 | A || B 为 true | 
| ! | 称为逻辑非运算符。用于改变运算数的逻辑状态。如果逻辑状态为 true,则通过逻辑非运算符可以使逻辑状态变为 false | !(A && B) 为 false | 
位运算符
位操作运算是按位来进行操作的。与、或、非和异或的真值表如下:
| p | q | p&q | p|q | p^q | 
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 
| 0 | 1 | 0 | 1 | 1 | 
| 1 | 1 | 1 | 1 | 0 | 
| 1 | 0 | 0 | 1 | 1 | 
假设变量 A 存储 60,变量 B 存储 13,那么:
下面的就是 C++语言所支持的位运算操作符:
假设变量 A 存储 60,变量 B 存储 13,那么:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
`A^B` = 0011 0001
~A  = 1100 0011| 运算符 | 描述 | 例子 | 
|---|---|---|
| & | 称为按位与运算符。它对整型参数的每一个二进制位进行布尔与操作。 | A & B = 12 . | 
| | | 称为按位或运算符。它对整型参数的每一个二进制位进行布尔或操作。 | A | B = 61. | 
| ^ | 称为按位异或运算符。它对整型参数的每一个二进制位进行布尔异或操作。异或运算是指第一个参数或者第二个参数为true,并且不包括两个参数都为 true 的情况,则结果为true。 | (A ^ B) = 49. | 
| ~ | 称为按位非运算符。它是一个单运算符,对运算数的所有二进制位进行取反操作。 | ~B = -61 . | 
| << | 称为按位左移运算符。它把第一个运算数的所有二进制位向左移动第二个运算数指定的位数,而新的二进制位补0。将一个数向左移动一个二进制位相当于将该数乘以2,向左移动两个二进制位相当于将该数乘以4,以此类推。 | A << 1 =120. | 
| >> | 称为按位右移运算符。它把第一个运算数的所有二进制位向右移动第二个运算数指定的位数。为了保持运算结果的符号不变,左边二进制位补 0 或 1 取决于原参数的符号位。如果第一个运算数是正的,运算结果最高位补 0;如果第一个运算数是负的,运算结果最高位补 1。 | A >> 1 = 15. | 
| >>> | 称为 0 补最高位无符号右移运算符。这个运算符与>>运算符相像,除了位移后左边总是补0. | A >>> = 15. | 
赋值运算符
下面的就是C++语言所支持的赋值运算操作符:
| 运算符 | 描述 | 例子 | 
|---|---|---|
| = | 简单赋值运算符,将右边运算数的值赋给左边运算数 | C = A + B 将 A+B 的值赋给 C | 
| += | 加等赋值运算符,将右边运算符与左边运算符相加并将运算结果赋给左边运算数 | C += A 相当于 C = C + A | 
| -= | 减等赋值运算符,将左边运算数减去右边运算数并将运算结果赋给左边运算数 | C -= A 相当于C = C - A | 
| *= | 乘等赋值运算符,将右边运算数乘以左边运算数并将运算结果赋给左边运算数 | C *= A 相当于C = C * A | 
| /= | 除等赋值运算符, 将左边运算数除以右边运算数并将运算结果赋值给左边运算数 | C /= A 相当于 C = C / A | 
| %= | 模等赋值运算符,用两个运算数做取模运算并将运算结果赋值给左边运算数 | C %= A 相当于 C = C % A | 
| <<= | 左移且赋值运算符 | C <<= 2 相当于 C = C << 2 | 
| >>= | 右移且赋值运算符 | C >>= 2 相当于 C = C >> 2 | 
| &= | 位与且赋值运算符 | C &= 2 相当于 C = C & 2 | 
| ^= | 位异或且赋值运算符 | C ^= A 相当于 C = C ^ A | 
| |= | 位或且赋值运算符 | C |= A 相当于 C = C | A | 
复合运算符
下面是 C++ 支持的其他运算符:
| 操作符 | 描述 | 
|---|---|
| sizeof | sizeof 操作符返回变量占用内存的大小。比如,sizeof(a),a 是一个整数时,返回 4 | 
| 条件 ? X : Y | 条件操作符:如果条件判断为true,则返回 X,否则返回 Y. | 
| , | 逗号操作符:可以使操作顺序执行。整体逗号表达式的值就是逗号最后表达式的返回结果。 | 
| .(点) 和 ->(箭头) | 成员操作符:用于获取类、结构体或联合体成员的引用。 | 
| 转换 | 转换操作符:可以将数值类型转成其他类型,比如,int(2.2000)将返回 2. | 
| & | 取地操作符:可以返回一个变量的地址。比如, &a 将会返回变量实际的内存地址。 | 
| * | 指针操作符:指向一个变量。比如 *var 意味着指向变量 var. | 
C++ 中操作符优先级
运算符优先级确定表达式中项的分组。这会影响如何表达一个表达式。某些操作符比其他有更高的优先级,例如,乘法运算符的优先级高于加法操作符。
比如 x=7+3*2,这里x的值是13而不是20,因为乘法优先级比加法高。所以应该先执行3乘2,然后再加7.
操作符的优先级如下表,上方的优先级比下方高。较高优先级的操作符优先进行计算。
| 分类 | 操作符 | 操作顺序 | 
|---|---|---|
| 后缀运算 | () [] -> . ++ - - | 从左到右 | 
| 一元运算 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 | 
| 乘法 | * / % | 从左到右 | 
| 加法 | + - | 从左到右 | 
| 移位 | << >> | 从左到右 | 
| 相等 | == != | 从左到右 | 
| 比较 | < <= > >= | 从左到右 | 位与 | & | 从左到右 | 
| 异或 | ^ | 从左到右 | 
| 位或 | | | 从左到右 | 
| 逻辑与 | && | 从左到右 | 
| || | 逻辑或 | 从左到右 | 
| 条件 | ?: | 从左到右 | 
| 赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 | 
| 逗号 | , | 从左到右 |