第四章 表达式

文章目录

      • 1.左值和右值
      • 2.求值顺序
      • 3.余数
      • 4.运算符优先级
      • 5.右结合律,多个变量同时赋值
      • 6.赋值循环优化写法
      • 7. `sizeof`
      • 8.类型上转型
      • 9.强制类型转换
        • 1.`static_cast`
        • 2.`const_cast`
        • 3.`reinterpret_cast`(不推荐使用)

1.左值和右值

简单归纳:当一个对象被用作右值时,用的是对象的值(内容).当对象用作左值的时候,用的是对象的身份(在内存中的位置.地址)

需要右值的地方可以用左值替代,但是右值不能当左值使用

2.求值顺序

int i = 0;
cout << i++ << " " << i << endl;	//0 1
cout << i << " " << i++ << endl;	//1 0
cout << i << " " << ++i << endl;	//1 1
cout << ++i << " " << i << endl;	//1 1

3.余数

//符号只看余数
-3 % 2 = -1;
3 % -2 = 1;
//浮点数不能取余,且被余数不能为0

4.运算符优先级

逻辑非! > 算术(加减乘除) > 关系(大于等于不等于) > 逻辑与&& > 逻辑或|| > 赋值=;
*解引用的优先级 < 前置后置++;
*解引用的优先级 < .;

cout << *it++;++,后置++会返回原来的it;
解引用就是解原来的it;

5.右结合律,多个变量同时赋值

int a, b, c;
a = b = c = 0;

int i;double d;
i = d = 3.5; //3 3.5
d = i = 3.5; //3 3

6.赋值循环优化写法

//以前
int i = get_value();
while(1 != 42)
{
    ...
    i = get_value();
}
//现在
int i;
while((i = get_value) != 42)
{
    ...
}

7. sizeof

满足右结合律. 其所得值是一个size_t类型

sizeof *p;  //右结合律,运行等价于sizeof(*p).且不用在乎p的值,所以无论如何返回均为4 

注意:

  1. 当字符数组表示字符串时,其sizeof值将’/0’计算进去。(strlen不会计算’\0’,且遇到结束符’\0’停止)
  2. 当数组为形参时,其sizeof值相当于指针的sizeof值。

8.类型上转型

bool -> char -> unsigned char -> short -> unsigned short -> int -> long	 -> float -> double

9.强制类型转换

//type为目标数据类型,expression为原始数据类型变量或者表达式
cast-name<type>(expression);
cast-name = [static_cast | dynamic_cast | const_cast | reinterpret_cast];

1.static_cast

相当于传统的C语言里的强制转换,可以强制转换为除了以下的任意类型,

不能转换掉expression的const、volatile、或者__unaligned属性。

2.const_cast

const_cast,用于修改类型的const或volatile属性。

该运算符用来修改类型的const(唯一有此能力的C+±style转型操作符)或volatile属性。除了const 或volatile修饰之外, new_type和expression的类型是一样的。

  1. 常量指针被转化成非常量的指针,并且仍然指向原来的对象;
  2. 常量引用被转换成非常量的引用,并且仍然指向原来的对象;
  3. const_cast一般用于修改底指针。如const char *p形式。
const int g = 20;
//int *h = &g;
int *h = const_cast<int *>(&g);
*h = 52;
cout << g + 10;  //30
cout << *h + 10; //62

3.reinterpret_cast(不推荐使用)

type必须是一个指针、引用、算术类型、函数指针或者成员指针。

它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

你可能感兴趣的:(c++,primer,c++,开发语言,后端)