1、算术运算符
运算符 | 功能 | 描述 |
---|---|---|
+ |
一元正号 | + expr |
- |
一元负号 | - expr |
* |
乘法 | expr * expr |
/ |
除法 | expr / expr |
% |
求余 | expr % expr |
+ |
加法 | expr + expr |
- |
减法 | expr - expr |
上述运算符的优先级中,由上往下,一元运算符优先级最高,其次是乘除运算,最后是加减运算,所有的运算符都满足左结合律。
对于求余运算,如果m和n都是整数,且m非0;则表达式(m/n)*n+m%n
的求值结果与m相等,即若m%n不为0,则结果的符号和m相同。除了-m导致溢出的特殊情况,其他时候(-m)/n
和m/(-n)
都等于-(m/n)
,m%(-n)
等于m%n
,(-m)%n
等于-(m%n)
。
2、逻辑运算符
运算符 | 结合律 | 功能 | 描述 |
---|---|---|---|
! |
右 | 逻辑非 | !expr |
< |
左 | 小于 | expr < expr |
<= |
左 | 小于等于 | expr <= expr |
> |
左 | 大于 | expr > expr |
>= |
左 | 大于等于 | expr >= expr |
== |
左 | 相等 | expr == expr |
!= |
左 | 不相等 | expr != expr |
&& |
左 | 逻辑与 | expr && expr |
|| |
左 | 逻辑或 | expr || expr |
对于逻辑与和或运算有以下规则(短路求值):
- 逻辑与运算:当且仅当左侧运算对象为真时才对右侧运算对象求值
- 逻辑与运算:当且仅当左侧运算对象为假时才对右侧运算对象求值
3、递增和递减运算符
递增运算符(++)和递减运算符(–)提供了简单的加1和减1操作。有两种形式:前置版本和后者版本。区别在于,前置版本是先将运算符对象加1(或减1),然后改变后的对象作为求值结果。后置版本也会将运算对象加1,但求值结果是运算对象改变之前那个值的副本:
int i = 0, k = 0, j;
j = ++i; //j = 1, i = 1:前置版本得到递增之后的值
j = k++; //j = 0, k = 1:后置版本得到递增之前的值
简单来说就是,符号和变量谁在前,先执行谁。递增在前,就先递增再求值;递增在后,就先求值再递增。
4、成员访问运算符
点运算符和箭头运算符都可用于访问成员。点运算符获取类对象的一个成员;箭头运算符与点运算有关,表达式ptr->mem
等价于(*ptr).mem
:
string s1 = "a string", *p = &s1;
auto n = s1.size();
n = (*p).size();
n = p->size();
Tip:解引用运算符的优先级低于点运算符,因此执行解引用运算的子表达式两端必须加上括号
5、条件运算符
条件运算符(?:)使用方法:
cond ? expr1 : expr2;
cond是判断条件的表达式,若cond为真,则计算expr1,并返回其值,否则计算expr2,返回expr2。
6、位运算符
位运算常常用于整数类型的运算对象,其运算对象可看作是二进制位的集合
运算符 | 功能 | 描述 |
---|---|---|
~ |
位求反 | ~ expr |
<< |
左移 | expr1 << expr2 |
>> |
右移 | expr1 >> expr2 |
& |
位与 | expr1 & expr2 |
^ |
位异或 | expr1 ^ expr2 |
| |
位或 | expr1 | expr2 |
将变量var的第n位置1:
var |= 1 << n;
将变量var的第n位置0:
var &= ~(1 << n;)
7、sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数。其运算结果部分依赖于其作用的类型:
- 对char或者类型为char的表达式执行sizeof,其结果是1
- 对引用类型执行sizeof运算得到被引用对象所占空间的大小
- 对指针执行sizeof运算得到指针本身所占空间的大小
- 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需有效
- 对数组执行sizeof运算得到整个数组所占空间的大小
- 对string/vector对象执行sizeof运算,只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间