第4章 表达式

本文最后更新于:2023年8月25日 凌晨

第4章 表达式

1. 基础

一些运算符的基本概念

1.1 基本概念

重载运算符

赋予基本运算符不同的含义和运算方式,使用重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符定义的;但是运算对象的个数、运算符的优先级和结合律都是无法改变的 。

左值和右值

左值,使用的是对象的身份(在内存中的位置);右值,使用的是对象的(内容)。

1.2 优先级与结合律

基本的运算优先级和数学中的优先级一样。

括号无视优先级,在不确定默认的优先级时可以使用括号。

2. 算术运算符

常用算术运算符

3. 逻辑和关系运算符

逻辑和关系运算符

短路原则

  • 对于逻辑与运算符来说,当且仅当左侧运算对象为真时才对右侧运算对象求值
  • 对于逻辑或运算符来说,当且仅当左侧运算对象为假时才对右侧运算对象求值

4. 赋值运算符

赋值和初始化是两个不同的概念,虽然都使用 = 运算符

1
2
3
int i = 10, k = 0;		//这里是初始化,不是赋值操作
int j; //声明定义一个变量
j = 1; //赋值操作

赋值运算符满足右结合律。对于多重赋值语句中的每一个对象,它的类型或者与右边对象的类型相同、或者可由右边对象的类型转换得到

1
2
3
4
int i,j;
i = j = 0; // 正确,都被赋值为0
int v, *p;
v = p = 0; // 错误,不能把指针的值赋给int

5. 递增和递减运算符

递增(递减)运算符有前置(++i)和后置(i++

前置将运算对象加 1 (或减 1), 并返回改变后的对象;后置版本将运算对象加 1 (或减 1), 但返回改变前那个值的副本 。

如果没有特别的需求,建议使用前置的版本

e.g.: *iter++实现一个对象的遍历

6. 成员访问运算符

成员运算符有点运算符箭头运算符

1
2
3
//这两个表达式是等价的
ptr->mem;
(*ptr).mem; //* 优先级低于 . 所以要加括号

7. 条件运算符

条件运算符 ?: 是一个三元运算符,格式:

1
2
3
4
5
6
cond ? expr1 : expr2;
//等价形式
if (cond)
expr1;
else
expr2;

8. 位运算符

位运算符是在二进制的层面对数据操作,以下是常用的位运算符

9. sizeof 运算符

sizeof 运算符返回一条表达式或一个类型名字所占的字节数。该运算符有两种形式

1
2
3
4
5
Sales_data data, *p; 
sizeof(type);
sizeof expr; // 返回expr的类型的大小,不会实际计算
sizeof p; // 指针所占的空间大小
sizeof *p; // p所指类型的空间大小

10. 逗号运算符

逗号运算符 含有两个运算对象,按照从左向右的顺序依次求值

1
2
3
4
5
vector<int>::size_type cnt = ivec.size();
//将把从size到1的值赋给ivec的元素
for(vector<int>::size_type ix = 0;
ix != ivec.size; ++ix, --cnt)
ivec[ix] = cnt;

11. 类型转换

隐式转换

由编译器完成,可能会出现精度损失

显示转换

命名类型的强制类型转换,其形式如下:

1
cast-name<type>(expression);

其中type是转换的目标类型而 expression 是要转换的值。如果 type 是引用类型,则结果是左值。

cast-namestatic_castdynamic_castconst_castreinterpret_cast中的一种。

static_cast , 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast

1
2
//进行强制类型转换以便执行浮点数除法, j, i是int
double slope = static_cast<double>(j) / i;

const_cast, 只能改变运算对象的底层const

1
2
3
4
5
6
const char *pc;
char *p = const_cast<char*>(pc); // 正确,但是通过p写值是未定义的行为
const_cast<string>(pc); // 错误,const_cast只改变常量属性

char *q = static_cast<char*>(pc); //错误,static_cast不能转换掉const性质
static_cast<string>(pc); // 正确,字符串字面值转换成string类型

reinterpret_cast, 通常为运算对象的位模式提供较低层次上的重新解释 这里不是很明白

1
2
int *ip;
char *pc = reinterpret_cast<char*>(ip);

第4章 表达式
https://kingw413.github.io/2023/08/23/Ch4-表达式/
作者
Whd
发布于
2023年8月23日
许可协议