Chapter 4: Expressions

  • 优先级 结合律 求值顺序各自的意义
    优先级和结合律共同确定了表达式的组合方式, 对于一个复杂的表达式, 高优先级运算符的运算对象相对于低优先级的运算符运算对象先结合在一起, 优先级相同的运算符运算对象依靠结合律来组合. 运算符满足左结合律意味着如果运算符优先级相同, 将按照从左向右的顺序组合运算对象.
6 + 3 * 4 / 2 + 2 // 复杂的表达式
// (1)乘除运算符的优先级高于加减, 所以先看乘除
// (2)乘除运算符优先级相同, 结合律为自左向右, 3 * 4先组合, 然后组合除法
// (3)加法运算符结合律为自左向右, 综合为 ((6+((3*4)/2))+2)

求值顺序表征了运算对象的求值顺序, 大多数情况下, 没有明确的求值顺序.

4 / 3 + 2 * 3 // 表达式
/* 对于加法运算符来说, 根据优先级我们知道 4 / 3 和 2 * 3一定比加法先进行运算, 但是除法和乘法哪个先运算是不一定的 */

处理复合表达式的两条准则:
1. 拿不准的时候使用括号强制使表达式的组合关系符合要求
2. 如果复合表达式中某个运算改变了运算对象的值,就不要在该表达式?中使用这个运算对象, 除非该运算和运算对象作为一个整体使用. 如: *++iter


  • 怎么判断左值右值?
    一个简单的方法是: 当一个对象被用作右值的时候, 我们使用的是对象的值(内容); 当一个对象被用作左值的时候, 我们使用的是对象的空间(内存).

  • 各运算符需要注意的点

    • 除法运算的取整问题
      C++11规定除法运算的商一律向零取整, 即不论正负, 直接截断.
    • 取模运算的定义
      如果m和n是整数且n非零, 则表达式 (m/n)*n+m%n 的值与 m 相等, 也就是 m%n = m - (m/n)*n , 隐含的意思是取模结果符号与m相同.

    • 逻辑与和逻辑或的短路求值
      逻辑与运算符和逻辑或运算符都事先求左侧运算对象的值再求右侧运算对象的值, 当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值. 称其为短路求值.

    • sizeof运算符的操作
      sizeof运算符返回一条表达式或一种数据类型所占的字节数, 所得值为size_t类型. 重要的一点:

      sizeof运算符不会实际计算其运算对象的值, 运算结果依赖于作用对象类型


  • 类型转换

    • 隐式转换

      1. 小整数类型(bool, char, signed char, short…)会被提升为int类型, 较大的char类型(wchar_t, char16…)会被提升为能容纳原类型的最小整数类型(int, unsigned int, long…)中的一种.
      2. 条件中, 非布尔类型转换为布尔类型.
      3. 初始化中, 初始值转换为对象的类型.
      4. 如果一个运算对象是无符号的类型, 另一个是有符号类型, 且无符号类型能表示的范围不小于有符号类型, 那么有符号转换成无符号类型. 若有符号类型表示范围大于无符号类型, 转换结果依赖于机器.
      5. 数组转换为首元素的指针
      6. 常量整数值0或字面值nullptr转换为任意指针类型
      7. 指向任意非常量的指针能转换成void*
      8. 指向任意对象的指针能转换成const void* (对引用也适用)
      9. 类类型能进行由编译器自动执行的转换, 不过编译器每次只能执行一种类类型的转换
    • 显示转换(强制类型转换)
      强制转换的语法(C++版):

cast-name<type>(expression)
// type为转换的目标类型
// expression为要转换的值
// cast-name为static_cast dynamic_cast const_cast reinterpret_cast中的一种, 指明进行哪种转换

static_cast 用于:

  • 进行强制转换以便执行浮点数运算
double slope = static_cast<double>(integer) / integer;
  • 将较大的算术类型赋值给较小的类型
long num = 1000000;
int integer = static_cast<int>(num);
  • 将void*指针还原为原来的类型
void *ptr = &value;
double *ptrDouble = static<double *>(ptr);
  • 转换对象不能包含const

const_cast 用于:
消除某个const类型的底层const性质

const char *ptrC; // 指向const char类型的指针
char *ptr = const_cast<char *>(ptrC); // 将const char * 转换为char *

reinterpret_cast 转换依赖于机器, 不要使用这种转换

强制转换干扰正常的类型检查, 尽量避免使用. 尤其是reinterpret_cast.

强制转换的语法(C语言版)

type (expr); // 函数风格
(type) expr; // C语言风格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值