运算与表达式
算术运算
基本算术运算符:+ - * /(若整数相除,结果取整) %(取余,操作数为整数)
优先级与结合性:先乘除,后加减,同级自左至右
++, --(自增、自减),例:i++; --j;
二者区别:i++ :先引用后增加 ;++i :先增加后引用
赋值运算
将值赋给变量
赋值运算符“=”
赋值表达式:用赋值运算符连接的表达式
例:n=5,n = n + 5
表达式的值:赋值运算符左边对象被赋值后的值
表达式的类型:赋值运算符左边对象的类型
复合的赋值运算符:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
例:a += 3 等价于 a = a + 3,x *= y + 8 等价于 x = x * (y + 8)
逗号运算和逗号表达式
格式:表达式1,表达式2
求解顺序及结果:先求解表达式1,再求解表达式2,最终结果为表达式2的值
例:a = 3 * 5 , a * 4 ,最终结果为60
关系运算与关系表达式
关系运算是比较简单的一种逻辑运算,优先次序为:
关系表达式是一种最简单的逻辑表达式,其结果类型为 bool,值只能为 true 或 false。
例如:a > b,c <= a + b,x + y == 3
逻辑运算与逻辑表达式
逻辑运算符:!(非) &&(与) ||(或)
优先次序: 高 → 低
逻辑运算结果类型:bool,值只能为 true 或 false。
逻辑表达式
例如:(a > b) && (x > y)
“&&”的运算规则:两侧表达式都为真,结果为真;有一侧表达式为假,结果为假。
“&&” 的“短路特性”:表达式1 && 表达式2
先求解表达式1,若表达式1的值为false,则最终结果为false,不再求解表达式2。
若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果。
“||”的运算规则:两侧表达式都为假,结果为假;有一侧表达式为真,结果为真。
“||” 的“短路特性”:
表达式1 || 表达式2,先求解表达式1,若表达式1的值为true,则最终结果为true,不再求解表达式2,若表达式1的结果为false,则求解表达式2,以表达式2的结果作为最终结果。
条件运算符与条件表达式
一般形式:表达式1?表达式2:表达式3,表达式1 必须是 bool 类型。
执行顺序:先求解表达式1,若表达式1的值为true,则求解表达式2,表达式2的值为最终结果,若表达式1的值为false,则求解表达式3,表达式3的值为最终结果。
条件运算符优先级高于赋值运算符,低于逻辑运算符
例:
表达式1是bool类型,表达式2、3的类型可以不同,条件表达式的最终类型为 2 和 3 中较高的类型。
sizeof运算
语法形式:sizeof (类型名)或 sizeof 表达式
结果值:“类型名”所指定的类型,或“表达式”的结果类型所占的字节数。
例:sizeof(short),sizeof x
位运算——按位与(&)
运算规则:将两个运算量的每一个位进行逻辑与操作
举例:计算 3 & 5
用途:将某一位置0,其他位不变取指定位。;
例如:将char型变量a的最低位置0: a = a & 0xfe; ;(0xfe:1111 1110)
例如:有char c; int a; 取出a的低字节,置于c中:c=a & 0xff; (0xff:1111 1111)
位运算——按位或(|)
运算规则
将两个运算量的每一个位进行逻辑或操作
举例:计算 3 | 5
用途:将某些位置1,其他位不变。
例如,将 int 型变量 a 的低字节置 1 :a = a | 0xff。
位运算——按位异或(^)
运算规则: 若对应位相同,则结果该位为 0,若对应位不同,则结果该位为 1,
举例:计算 071^052
用途举例:使特定位翻转(与0异或保持原值,与1异或取反)
例如:要使 01111010 低四位翻转:
位运算——取反(~)
运算规则:单目运算符,对一个二进制数按位取反。
例:
025:0000000000010101
~025:1111111111101010
位运算——移位(<<、>>)
左移运算(<<):左移后,低位补0,高位舍弃。
右移运算(>>):右移后低位舍弃,对于无符号数高位补0,对于有符号数高位补“符号位”
运算符优先级
优先级 | 运算符 | 结合性 |
1 | [ ] ( ) . –> 后置 ++ 后置 –– | 左→右 |
2 | 前置 ++ 前置 –– sizeof & * +(正号) –(负号) ~ ! | 右→左 |
3 | (强制转换类型) | 右→左 |
4 | .* ->* | 左→右 |
5 | * / % | 左→右 |
6 | + – | 左→右 |
7 | << >> | 左→右 |
8 | < > <= >= | 左→右 |
9 | == != | 左→右 |
10 | & | 左→右 |
11 | ^ | 左→右 |
12 | | | 左→右 |
13 | && | 左→右 |
14 | || | 左→右 |
15 | ? : | 右→左 |
16 | = *= /= %= += –= <<= >>=&= ^= |= | 右→左 |
17 | , | 左→右 |
混合运算时数据类型的转换
一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)要求两个操作数的类型一致。
在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据。
条件 | 转换 | |
有一个操作数是long double型。 | 将另一个操作数转换为long double型。 | |
前述条件不满足,并且有一个操作数是double型。 | 将另一个操作数转换为double型。 | |
前述条件不满足,并且有一个操作数是float型。 | 将另一个操作数转换为float型。 | |
前述条件不满足(两个操作数都不是浮点数)。 | 有一个操作数是unsigned long long型。 | 将另一个操作数转换为unsigned long long型。 |
有一个操作数是long long型,另一个操作数是unsigned long型 | 两个操作数都转换为unsigned long long型。 | |
前述条件不满足,并且有一个操作数是unsigned long型。 | 将另一个操作数转换为unsigned long型。 | |
前述条件不满足,并且有一个操作数是long型,另一个操作数是unsigned int型。 | 将两个操作数都转换为unsigned long型。 | |
前述条件不满足,并且有一个操作数是long型。 | 将另一个操作数转换为long型。 | |
前述条件不满足,并且有一个操作数是unsigned int型。 | 将另一个操作数转换为unsigned int型。 | |
前述条件都不满足 | 将两个操作数都转换为int型。 |
将一个非布尔类型的算术值赋给布尔类型时,算术值为0则结果为false,否则结果为true。
将一个布尔值赋给非布尔类型时,布尔值为false则结果为0,布尔值为true则结果为1
将一个浮点数赋给整数类型时,结果值将只保留浮点数中的整数部分,小数部分将丢失。
将一个整数值赋给浮点类型时,小数部分记为0。如果整数所占的空间超过了浮点类型的容量,精度可能有损失。
混合运算时数据类型的转换——显式转换
显式类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。
语法形式:类型说明符(表达式),(类型说明符)表达式,类型转换操作符<类型说明符>(表达式)
类型转换操作符可以是:const_cast、dynamic_cast、reinterpret_cast、static_cast
例:int(z), (int)z, static_cast<int>(z),这三种形式完全等价
数据的输入和输出
I/O流
在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被建立,使用后要被删除。
数据的输入与输出是通过I/O流来实现的,cin和cout是预定义的流类对象。cin用来处理标准输入,即键盘输入。cout用来处理标准输出,即屏幕输出。
从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。
预定义的插入符和提取符
“<<”是预定义的插入符,作用在流类对象cout上便可以实现项标准输出设备输出。
cout << 表达式 << 表达式...
标准输入是将提取符作用在流类对象cin上。
cin >> 表达式 >> 表达式...
提取符可以连续写多个,每个后面跟一个表达式,该表达式通常是用于存放输入值的变量。例如:int a, b;cin >> a >> b;
常用的I/O流类库操纵符
操纵符名 | 含 义 |
dec | 数值数据采用十进制表示 |
hex | 数值数据采用十六进制表示 |
oct | 数值数据采用八进制表示 |
ws | 提取空白符 |
endl | 插入换行符,并刷新流 |
ends | 插入空字符 |
setsprecision(int) | 设置浮点数的小数位数(包括小数点) |
setw(int) | 设置域宽 |
例:cout << setw(5) << setprecision(3) << 3.1415;