表达式---C++ 基础

xiaoxiao2021-02-28  93

前言

这一章相对来说比较轻松,主要涉及到的是c++中常见的运算符。一些耳熟能祥的东西我就不打算写在博客里了,主要分析一些细微的点。虽然不要注重细节,但是不知道细节就没有好的语言基础。骐骥千里,非一日之功。

C++ 中提供了许多的运算符,算术运算符、逻辑和关系运算符、赋值运算符、位运算符等等。按照操作数的数量,可以分为一元运算符、二元运算符、三元运算符,一般的来说它们之间的优先级也是一元大于二元,二元大于三元。

基础

1.左值和右值

一个表达式,不是左值就是右值。这个概念从C语言继承过来(左值可以位于赋值语句的左边,右值不能)。

在C++中,左右的概念没有那么简单。但是记住一句话就行:

对象被当作右值时,用的是它的值(内容)对象被当作左值时,用的是它的身份(在内存中的位置)

因此,左值可以被当作右值来使用,但是右值不能被当作左值来使用。

2.逻辑和关系运算符

关于逻辑运算符,我们要知道 短路求值,并且在写代码时时刻记住这一点。

对于 & 运算,左边为真才对右边进行运算,左边为假就直接返回了对于 | 运算,左边为假才对右边进行运算,左边为真就直接返回了

3.递增和递减运算符

++,-- 操作有前置版本和后置版本,注意一点,后置版本需要将原始值保存下来,以便于返回这个未修改的版本,如果我们不需要修改前的值,这个操作就是一种浪费。

因此,在使用时,如果明白自己的意图,就可以区别使用。如果只需要增加一,那就使用前置版本。

4.位运算

在算法里,这个值得开一个专题来讲。位运算相比算术运算会更快一些,但是会有一些小技巧。这里提一个小点。

移位运算:左移右边是补0,而右移需要根据环境来决定补0还是补1,因此,我们在进行位运算时,最好将数据类型设置成 unsigned 无符号类型,也要注意有符号类型隐式转成无符号类型。

5.类型转换

分为显示转换和隐式转化。

显示转换有:

static_cast : 只要不包含底层const,都可以使用const_cast : 只能改变运算对象的底层constreinterpret_cast : 为运算对象的位模式提供较低层次的重新解释,本质依赖机器,看情况使用

优先级

从上到下,优先级依次降低(取成员高、后置比前置高、一元比二元高、二元比三元高、算数比逻辑高、算数比移位高、赋值低、逗号最低)

:: 作用域
. 成员选择-> 成员选择[] 下标() 函数、类型构造
a ++ 后置递增a -- 后置递减typeid(a) 类型ID、运行时类型IDstatic_cast<int>(a) 类型转换
++ a 前置递增-- a 前置递减~ a 位求反! a 逻辑非- a 一元负号+ a 一元正号* a 解引用& a 取地址(int)a 类型转换sizeof(a) 对象大小new 创建对象new int[] 创建数组delete 释放对象delete [] 释放数组
->* ptr_mem 指向成员选择的指针.* prt_mem 同上
a * b 乘a / b 除a % b 取模
a + b 加a - b 减
a << 1 左移a >> 1 右移
a < b 小于a <= b 小于等于a > b 大于a >= b 大于等于
a == b 相等a != b 不相等
a & b 位与
a ^ b 位异或
a | b 位或
a && b 逻辑与
a || b 逻辑或
a ? b : c 条件
a = 10 赋值a *= 100a -= 100a += 100a %= 100a <<= 100a >>= 100a &= 100a |= 100a ^= 100
throw 抛出异常
a , b 逗号
转载请注明原文地址: https://www.6miu.com/read-48207.html

最新回复(0)