C++ PRIMER之5 表达式

本文深入解析表达式求值过程中的优先级、结合性、操作数顺序等核心概念,涵盖算术、关系、逻辑、位操作符及赋值、自增自减等操作符的用法,并介绍sizeof、类型转换、new和delete表达式的功能及注意事项。重点突出表达式求值顺序、操作符优先级和类型转换的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 要理解由多个操作符组成的表达式,必须先理解操作符的优先级、结合性和操作数的求值顺序。

 

1 算术操作符

+ - * / %

注意溢出和截断 

 

两个操作数为正,除法(/)和求模(%)操作的结果也是正数(或零);
两个操作数都是负数,除法操作的结果为正数(或零),而求模操作的结果则为负数(或零);

如果只有一个操作数为负数,这两种操作的结果取决于机器;
求模结果的符号也取决于机器,而除法操作的值则是负数(或零)

 

2 关系操作符和逻辑操作符

! < > ==  <= >= != || &&

|| &&  仅当由 expr1 不能确定表达式的值时,才会求解 expr2。 短路求值

 

bool 类型可转换为任何算术类型——bool 值 false 用 0 表示,而 true 则为 1。

 

3  位操作符 (推荐使用 bitset)

~ >> << | & ^

操作符  功能  用法
~  bitwise NOT(位求反) ~expr
<<  left shift(左移)  expr1 << expr2
>>  right shift(右移)  expr1 >> expr2
&  bitwise AND(位与)  expr1 & expr2
^  bitwise XOR(位异或) expr1 ^ expr2
|  bitwise OR(位或)  expr1 | expr2

 

4 赋值操作符

当表达式含有多个赋值操作符时,从右向左结合。

 

5 复合赋值操作符

+=  -=  *=  /=  %=  // arithmetic operators
<<=  >>=  &=  ^=  |= // bitwise operators

使用复合赋值操作时,左操作数只计算了一次;

而使用相似的长表达式时,该操作数则计算了两次,第一次作为右操作数,而第二次则用做左操作数。

 

6 自增和自减操作符 ++ --

因为前置操作返回加 1 后的值,所以返回对象本身,这是左值。++i

 而后置操作返回的则是右值。 i++

int i = 0, j;
j = ++i;    // j = 1, i = 1:
j = i++;    // j = 1, i = 2:

建议:只有在必要时才使用后置操作符

 

7 sizeof操作符

sizeof 操作符的作用是返回一个对象或类型名的长度,返回值的类型为 size_t 单位为字节.

对 char 类型或值为 char 类型的表达式做 sizeof 操作保证得 1

对引用类型做 sizeof 操作将返回存放此引用类型对象所需的内在空间大小。

对指针做 sizeof 操作将返回存放指针所需的内在大小

对数组做 sizeof 操作等效于将对其元素类型做 sizeof 操作的结果乘上数组元素的个数

// sizeof(ia)/sizeof(*ia) returns the number of elements in ia
int count = sizeof(ia)/sizeof(*ia);

 

8 优先级

圆括号凌驾于优先级之上

 

9 new和 delete表达式

以上表明程序员想通过在类型名后面使用一对内容为空的圆括号对动态创建的对象做值初始化。

int *pi = new int;  随机值
int *pi = new int(); 初始化为0

如果 new 表达式无法获取需要的内存空间,系统将抛出名为 bad_alloc 的异常。

C++ 保证:删除 0 值的指针是安全的。

一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。

 

10 类型转换

对于包含 signed 和 unsigned int 型的表达式,其转换可能出乎我们的意料。表达式中的 signed 型数值会被转换为 unsigned 型。

在使用数组时,大多数情况下数组都会自动转换为指向第一个元素的指针:
int ia[10]; // array of 10 ints
int* ip = ia; // convert ia to pointer to first element

C++ 自动将枚举类型(第 2.7 节)的对象或枚举成员( enumerator )转换为整型

 

11 强制转换

强制类型转换操作符:static_cast、dynamic_cast、const_cast和 reinterpret_cast。

dynamic_cast
dynamic_cast 支持运行时识别指针或引用所指向的对象。

const_cast
const_cast ,顾名思义,将转换掉表达式的 const 性质

static_cast
编译器隐式执行的任何类型转换都可以由 static_cast 显式完成:

double *dp = static_cast<double*>(p);

reinterpret_cast
reinterpret_cast 通常为操作数的位模式提供较低层次的重新解释

 

arithmetic conversion(算术转换) binary operators(二元操作符)cast(强制类型转换)conversion(类型转换)dangling pointer(悬垂指针)implicit conversion(隐式类型转换)integral promotions(整型提升)operands(操作数)operator overloading(操作符重载)order of evaluation(求值顺序)unary operators(一元操作符)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值