一.算术运算符
1. 基本四则运算符:加减乘除模(+ - * / %)
int a = 20; int b = 10; cout<< a + b <<endl; // 30 cout<< a - b <<endl; // 10 cout<< a * b <<endl; // 200 cout<< a / b <<endl; // 2 cout<< a % b <<endl; // 0 --->模运算相当于数学中除法的余数
注意: 都是二元运算符,使用时必须要有左右两个操作数
int / int 结果还是int类型,而且向下取整
int a = 3; int b = 2; // 在数学中应该是1.5 但是在C++中输出结果为1 会向下取整,即小数点之后全部舍弃掉了 cout<< a / b <<endl;
做除法和取模时,右操作数不能为0
两侧操作数类型不一致时,向类型大的提升
cout<< 1 + 0.2 << endl; // +的左侧是int,右侧是double,在加之前int被提升为double // 故:输出1.2
2. 增量运算符 += -= *= %= (只适用于变量)
int a = 1; a += 2; // 相当于 a = a + 2 cout << a <<endl; // 输出3 a -= 1; // 相当于 a = a - 1 cout << a <<endl; // 输出2 a *= 3; // 相当于 a = a * 3 cout << a <<endl; // 输出6 a /= 3; // 相当于 a = a / 3 cout << a <<endl; // 输出2 a %= 3; // 相当于 a = a % 2 cout << a <<endl; // 输出2
3. 自增/自减运算符 ++ --
++是给变量的值+1,--是给变量的值-1。
int a = 12; int b = 0; b = a++;//b=12 a=13 先使用,后加一 b = ++a;//b=14 a=14 先加一,后使用 // --操作符给操作-1,与++含义类似
注:如果单独使用,【前置++】和【后置++】没有任何区别,都是给变量加一
只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
(a+b)++不合法
int main() { int i = 3; cout << i++ + i++ + i++ << endl; // 可读性太差 cout << i << endl; return 0; } 打印9,结束后i的值为6
二. 关系运算符 =表示赋值,==表示相等
关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false 。
int main() { int a = 10; int b = 20; // 注意:在C++中 = 表示赋值,要与数学中的含义区分 // 在C++中 == 表示相等 cout << (a == b) << endl; // 0 cout << (a != b) << endl; // 1 cout << (a < b) << endl; // 1 cout << (a > b) << endl; // 0 cout << (a <= b) << endl; // 1 cout << (a >= b) << endl; // 0 return 0; }
注:count<<5<a<15<<endl; 报错
三.逻辑运算符
逻辑运算符主要有三个: && || ! ,运算结果都是 bool类型。
1.逻辑与&&
两个为真才为真
int main() { int a = 1; int b = 2; cout << (a == 1 && b == 2) << endl;; // 左为真 且 右为真 则结果为真 cout << (a == 1 && b > 100) << endl; // 左为真 但 右为假 则结果为假 cout << (a > 100 && b == 2) << endl; // 左为假 但 右为真 则结果为假 cout << (a > 100 && b > 100) << endl; // 左为假 且 右为假 则结果为假 return 0; }
2.逻辑或||
int main() { int a = 1; int b = 2; cout << (a == 1 || b == 2) << endl; // 左为真 且 右为真 则结果为真 cout << (a == 1 || b > 100) << endl; // 左为真 但 右为假 则结果也为真 cout << (a > 100 || b == 2) << endl; // 左为假 但 右为真 则结果也为真 cout << (a > 100 || b > 100) << endl; // 左为假 且 右为假 则结果为假 return 0; }
3.逻辑非!
int main() { int a = 1; cout << !(a == 1) << endl; // a == 1 为true,取个非就是false cout << !(a != 1) << endl; // a != 1 为false,取个非就是true return 0; }
注:短路求值:对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表 达式。对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧 表达式
四.位运算符
位运算符主要有四个: & | ~ ^
1. 按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.
int main() { int a = 10; //0000 1010 int b = 20; //0001 0100 int ret = a&b; //0000 0000 cout << ret << endl; //输出0 return 0; }
2.按位或|:如果两个二进制位有一个是一, 则结果为 1, 否则结果为 0.
int main() { int a = 10; //0000 1010 int b = 20; //0001 0100 int ret = a|b; //0001 1110 cout << ret << endl; //输出30 return 0; }
3.按位取反~:一变零,零变一
十六进制:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 一个十六进制的数可以用4个比特位表示
int main() { int a = 0x55555555; // 0x表示16进制 一个十六进制5可以表示为0101 a = ~a; // 取反为1010 cout << hex << a << endl;// hex表示按十六进制输出 十六进制为a return 0;// 输出为aaaaaaaa }
4.按位异或^:如果两个二进制位相同, 则结果为 0, 否则结果为 1.
五.移位运算
移位运算符有两个:<< >> ,都是二元运算符,且都是按照二进制比特位来运算的。
1.左移 <<: 最左侧位不要了, 最右侧补 0.
// << 将高位丢弃,然后在低位补0 short s = 1024; // 0000 0100 0000 0000 s = s << 1; // 0000 1000 0000 0000 给s乘以2=2048 s = s << 1; // 0001 0000 0000 0000 给s乘以2 = 4096 s = s << 1; // 0010 0000 0000 0000 给s乘以2 = 8192 s = s << 1; // 0100 0000 0000 0000 给s乘以2 = 8192*2 s = s << 1; // 1000 0000 0000 0000 s = s << 1;
2.右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
char ch = 0x07; // 0000 0111 ch = ch >> 1; // 0000 0011--->3 ch = ch >> 1; // 0000 0001--->1 ch = ch >> 1; // 0000 0000--->0
注:1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
2. 右移 1 位, 相当于原 数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
六. 条件运算符
条件运算符也称为三目运算符,语法格式为: 表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值
int main() { int a = 30; int b = 20; // 求a和b的最大值 // 三目表达式来求: int ret = a > b ? a : b; cout << ret << endl; return 0; }
七.逗号表达式
语法格式:表达式1,表达式2;
求解过程:先求表达式1的值,再求表达式2的值,整个逗号表达式的结果为表达式2的值。