目录
算术运算与赋值运算
算术运算
l 基本算术运算符
n + - * /(若整数相除,结果取整)
n %(取余,操作数为整数)
l 优先级与结合性
n 先乘除,后加减,同级自左至右
l ++, --(自增、自减)
n 例:i++; --j;
赋值运算
l 将值赋给变量
l 赋值运算符“=”
l 赋值表达式:
n 用赋值运算符连接的表达式
n 例:
n=5
n = n + 5
n 表达式的值
赋值运算符左边对象被赋值后的值n 表达式的类型
赋值运算符左边对象的类型l 复合的赋值运算符
n +=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
n 例
a += 3 等价于 a = a + 3
x *= y + 8 等价于 x = x * (y + 8)
逗号运算、关系运算、逻辑运算和条件运算
逗号运算和逗号表达式
l 格式
表达式1,表达式2
l 求解顺序及结果
n 先求解表达式1,再求解表达式2
n 最终结果为表达式2的值
l 例
a = 3 * 5 , a * 4 最终结果为60
关系运算与关系表达式
l 关系运算是比较简单的一种逻辑运算,优先次序为:
l 关系表达式是一种最简单的逻辑表达式
n 其结果类型为 bool,值只能为 true 或false。
例如:a > b,c <= a + b,x + y == 3
逻辑运算与逻辑表达式
l 逻辑运算符
!(非) &&(与) ||(或)
优先次序: 高 → 低
l 逻辑运算结果类型:bool,值只能为 true 或false
l 逻辑表达式
例如:(a > b) && (x > y)
l “&&”的运算规则
n 两侧表达式都为真,结果为真;
n 有一侧表达式为假,结果为假。
l “&&” 的“短路特性”
表达式1 && 表达式2
n 先求解表达式1
n 若表达式1的值为false,则最终结果为false,不再求解表达式2
若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果
l “||”的运算规则
n 两侧表达式都为假,结果为假;
n 有一侧表达式为真,结果为真。
l “||” 的“短路特性”
表达式1 || 表达式2
n 先求解表达式1
n 若表达式1的值为true,则最终结果为true,不再求解表达式2
若表达式1的结果为false,则求解表达式2,以表达式2的结果作为最终结果
条件运算符与条件表达式
l 一般形式
n 表达式1?表达式2:表达式3
表达式1 必须是bool 类型
l 执行顺序
n 先求解表达式1,
n 若表达式1的值为true,则求解表达式2,表达式2的值为最终结果
若表达式1的值为false,则求解表达式3,表达式3的值为最终结果
l 条件运算符优先级高于赋值运算符,低于逻辑运算符
n 例
表达式1是bool类型,表达式2、3的类型可以不同,条件表达式的最终类型为2 和3 中较高的类型。
Sizeof运算、位运算
sizeof运算
l 语法形式
sizeof (类型名)
或 sizeof 表达式l 结果值:
“类型名”所指定的类型,或“表达式”的结果类型所占的字节数。l 例:
sizeof(short)
sizeof x
位运算——按位与(&)
l 运算规则
将两个运算量的每一个位进行逻辑与操作
l 举例:计算3 & 5
l 用途:
n 将某一位置0,其他位不变。
例如:将char型变量a的最低位置0: a = a & 0xfe; ;(0xfe:1111 1110)
n 取指定位。
例如:有char c; int a; 取出a的低字节,置于c中:c=a & 0xff; (0xff:1111 1111)
位运算——按位或(|)
l 运算规则
n 将两个运算量的每一个位进行逻辑或操作
l 举例:计算3 | 5
l 用途:
n 将某些位置1,其他位不变。
例如:将 int 型变量 a 的低字节置 1 :
a = a | 0xff;
位运算——按位异或(^)
l 运算规则
n 两个操作数进行异或:
若对应位相同,则结果该位为 0,
若对应位不同,则结果该位为 1,
l 举例:计算071^052
l 用途举例:使特定位翻转(与0异或保持原值,与1异或取反)
例如:要使 01111010 低四位翻转:
位运算——取反(~)
l 运算规则
n 单目运算符,对一个二进制数按位取反。
l 例:
025:0000000000010101
~025:1111111111101010
位运算——移位(<<、>>)
n 左移运算(<<)
左移后,低位补0,高位舍弃。
n 右移运算(>>)
右移后:
低位:舍弃
高位:
无符号数:补0
有符号数:补“符号位”
运算优先级、类型转换
运算符优先级
优先级 | 运算符 | 结合性 |
1 | [ ] ( ) . –> 后置 ++ 后置 –– | 左→右 |
2 | 前置 ++ 前置 –– sizeof & * +(正号) –(负号) ~ ! | 右→左 |
3 | (强制转换类型) | 右→左 |
4 | .* ->* | 左→右 |
5 | * / % | 左→右 |
6 | + – | 左→右 |
7 | << >> | 左→右 |
8 | < > <= >= | 左→右 |
9 | == != | 左→右 |
10 | & | 左→右 |
11 | ^ | 左→右 |
12 | | | 左→右 |
13 | && | 左→右 |
14 | || | 左→右 |
15 | ? : | 右→左 |
16 | = *= /= %= += –= <<= >>=&= ^= |= | 右→左 |
17 | , | 左→右 |
混合运算时数据类型的转换
l 一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)要求两个操作数的类型一致。
l 在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据。
条件 | 转换 | |
有一个操作数是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型。 |
l 将一个非布尔类型的算术值赋给布尔类型时,算术值为0则结果为false,否则结果为true。
l 将一个布尔值赋给非布尔类型时,布尔值为false则结果为0,布尔值为true则结果为1
l 将一个浮点数赋给整数类型时,结果值将只保留浮点数中的整数部分,小数部分将丢失。
l 将一个整数值赋给浮点类型时,小数部分记为0。如果整数所占的空间超过了浮点类型的容量,精度可能有损失。
混合运算时数据类型的转换——显式转换
l 显式类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。
l 语法形式
n 类型说明符(表达式)
n (类型说明符)表达式
n 类型转换操作符<类型说明符>(表达式)
n 类型转换操作符可以是:
const_cast、dynamic_cast、reinterpret_cast、static_cast
l 例:
int(z), (int)z, static_cast<int>(z)
三种完全等价