表达式
表达式由一个或多个运算对象(operand)组成,对表达式求值将得到一个结果。字面值和变量是最简单的表达式,其结果就是字面值和变量的值。把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式。
基本概念
重载运算符
c++语言定义了运算符作用于内置类型和复合类型的运算对象时所执行的操作。当运算符作用于类类型的运算对象时,用户可以自行定义其含义。因为这么自定义的过程事实上是为已存在的运算符赋予另外一层含义,所以称之为重载运算符。IO库的
‘>>’和’<<’运算符以及string对象、vector对象和迭代器使用的运算符都是重载运算符。
位运算
位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。位运算符提供检查和设置二进制位的功能。一般来说,如果运算对象是“小整形”,则它的值会被自动提升成较大的整数类型。运算对象可以是带符号的,也可以是无符号的,如果运算对象是带符号的且它的值为负,那么位运算符如果处理运算对象的“符号位”依赖于机器,而且,此时的左移操作可能会改变符号位的值,因此是一种未定义的行为。
关于符号位如何处理没有明确的规定,所有强烈建议仅将位运算符用于处理无符号类型。
运算符 | 功能 | 用法 |
---|---|---|
~ | 位求反(1置为0,0置为1) | ~expr |
<< | 左移(低位补零) | expr1”<<”expr2 |
>> | 右移(高位零) | expr1>>expr2 |
& | 位与(两个运算对象为1结果才为1,否则为零,可以用来取某位的值) | expr1&expr2 |
| | 位或(两个运算对象有一位为1或两位都为1,结果是1,否则为0)可用设置某位的值 | expr1 | expr2 |
^ | 位异或(两个运算对象有且只有一个1则结果是1,否则为0) | expr1 ^ expr2 |
例子
//假设班级中30个学生测试能不能通过(通过,不通过)。
//把这个值当成是位的集合来使用,long的最少尺寸为32位,int最少尺寸为16位
unsigned long quiz1= 0;
//设置第27位学生 通过 , UL是缩写unsigned long的意思
quiz1 |=1UL<<27;
//与上一条等价
quiz1 = quiz1 | 1UL<<27;
//设置不通过
quiz1 &= ~(1UL<<27);
//检查第27位有没有通过
bool status = quiz1 &(1UL<<27);
sizeof运算符
sizeo运算符返回一条表达式或一个类型名字所占的字节数。sizeof运算2符满足右结合律,其所得的值是一个size_t类型的常量表达式。运算符的运算对象有两种形式:
sizeof(type)
sizeof expr
Sales_data data ,*p;
sizeof(Sales_data); 存储Sales_data 类型的对象所占的空间大小
sizeof data; 同上
sizeof p; 指针所占的空间大小
sizeof *p ; p所指类型的空间大小
sizeof data.revenue; data的revenue成员对应的类型大小
sizeof Sales_data::revenue; 同上
int ia[10];
//ia的元素数组
constexpr size_t sz = sizeof(ia)/sizeof(*ia);
类型转换
在c++语言中,某些类型之间有关联。如果两种类型有关联,那么当程序需要其中一种类型的运算对象时,可以用另一种关联类型的对象或值为替代,换句话说,如果两种类型可以相互转换,那么它们是关联的。
隐式转换,首先 1转成double然后相关。最后强转成int
int iVal = 3.14+1;
数组转换成指针
int ia[10];
int *p = ia;//p指向数组首指针
隐式转换何时会发生?
- 在大多数表达式中,比int类型小的整形值首先提升为较大的整数类型
- 在条件中,非布尔值转换成布尔类型
- 初始化过程中,初始值转换成变量变量的类型,在赋值语句中,右侧运算对象转换成左侧运算对象的类型。
- 如果算术运算或关系运算的运算对象有多种类型,需要转换成同一种类型。
- 函数调用时也会发生类型转换
显示转换
…