C++ Primer 5th学习笔记3 表达式

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)/nm/(-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运算,只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间

猜你喜欢

转载自blog.csdn.net/qq_18150255/article/details/88636756