本章主要介绍运算符
一、表达式与运算符
运算优先级和结合律
平级运算从左往右,乘除优先级高于加减
一元运算符(正负号)优先级最高,接下来是乘除取余,最后加减
#include <iostream>
using namespace std;
int main() {
//1.算数运算符
cout << "1+2=" << 1 + 2 << endl;
cout << "1+2-3*4=" << 1 + 2 - 3 * 4 << endl;
int a = 20, b = 6;
cout << "a+b=" << a + b << endl;
cout << "a+1=" << a + 1 << endl;
//整数除法,得到的结果是整数
cout << "a/b=" << a / b << endl;
short a2 = 3;
long long b2 = 23435;
//参加计算,会把数据类型小的转化为数据类型大的,再去做统一计算
cout << "a2*b2=" << a2 * b2 << endl;
cout << "b2/b=" << b2 / b << endl;
float a3 = 20;
//浮点数除法,得到结果是浮点数
cout << "a3/b=" << a3 / b << endl;
//取余运算,得到小数结果 余数不一定是正的
// 取模运算只能对两个整数有效
cout << "a%b=" << a % b << endl;
cout << "-a%b=" << -a % b << endl;
cin.get();
二、赋值
2.1赋值运算符
//2.赋值运算符
a = 1;
a = b + 5;
const int c = 10;
//c = b;//错误
//用花括号括起来的数值列表,可以做赋值右侧对象
a = {10};
int arr[] = { 1,2,3,4,5 };
//赋值结合律从右到左
a = b = 10;
2.2 复合赋值运算符
//复合赋值运算符
int sum = a;
//sum = sum + b;
//sum = sum + c;
sum += b;
sum += c;
cout << "a+b+c=" << sum << endl;
2.3递增递减运算符
++a与a++表示的意思是一样的,均表示a = a+1,区别在做计算返回发的结果不一样
前置时,++a表示先加一,更新后的对象作为结果返回
后置时,a++先把对象直接返回,然后再加一
//递增递减运算符
cout << "++a=" << ++a << endl;
int i = 0, j;
//j = ++i;
j = i++;
cout << "i=" << i << endl;
cout << "j=" << j << endl;
输出i=1,j=0
三、关系和逻辑运算
3.1关系运算符
自左向右结合律
//关系
cout << "1<2:" << (1 < 2) << endl;
cout << "a<b:" << (a < b) << endl;
cout << "10==4+6:" << (10 == 4 + 6) << endl;
cout << "10==4+6:" << (10 == 4) + 6 << endl;
//逻辑
cout << "1<2&&3>5:" << (1 < 2 && 3 > 5) << endl;
cout << "1<2||3>5:" << (1 < 2 || 3 > 5) << endl;
cout << "!(1 < 2 || 3 > 5):" << !(1 < 2 || 3 > 5) << endl;
cin.get();
短路求值:如果左边计算得到最终结果,就不会计算右边结果
//短路求值
i = 0;
//1 < 2 && ++i;
1 < 2 || ++i;
cout << "i = " << i << endl;
输出:i=0
3.2 条件运算符
//条件运算符
cout << ((1 < 2 || ++i) ? "true" : "false") << endl;
cout << ((1 > 2 && ++i) ? "true" : "false") << endl;
3.3位运算符
非常底层的运算符,可以操作到具体的每一位(bit)数据
移位运算符,位逻辑运算符
<<左移运算符
输入输出会用到它,那是标准io库里面定义的运算符重载版本
使用程序员计算机查看二进制十进制十六进制的转换结果
//4.位运算符
unsigned char bits = 0xb5;
cout << hex;//输出结果为16进制
cout << "bits左移2位:" << (bits << 2) << endl;
cout << "bits左移8位:" << (bits << 8) << endl;
cout << "bits左移31位:" << (bits <<31) << endl;
cout << "bits右移3位:" << (bits >> 3) << endl;
位运算符可以做简单的乘除算法
cout << dec;//十进制输出
cout << (200 << 3) << endl;//200*2的三次方
cout << (100>>2) << endl;//100/4
位逻辑运算符
按位取反~
位与&
位或| :只要有1,结果为1,如果全为0,结果对应位为0
异或^:两个对应位相同为0,相异为1
//位逻辑运算
cout << (~5) << endl;
cout<<(5 & 12) << endl;
cout << (5 | 12) << endl;
cout << (5 ^ 12) << endl;
按位取反,5(0…101)取反后最高位为1,是一个负数,负数(1…010)的底层二进制是补码形式,补码(1…010)=原码取反+1,所以原码=(补码-1)取反。补码-1=1…001,(补码-1)取反=0…110=6,加上他的负数符号为-6。
异或用途:
1.a^0 = a
a^a = 0
//案例:从一组数中找出只出现一次的那个数
int i1 = 5, i2 = 12, i3 = 9, i4 = 5, i5 = 12;
cout << "只出现一次的那个数为:" << (i1^i2^i3^i4^i5)<<endl;
4.类型转换
4.1隐式类型转换
C++编译器自动对类型进行转换,不需要我们干涉,将长度较小的类型转化为较大类型
// 5.类型转化
//隐式类型转化
short s = 15.2 + 20;
cout << "s=" << s << endl;
cout << "15.2 + 20" << (15.2 + 20)<< endl;
cout << "s的长度为" << sizeof(s) << endl;
cout << "15.2 + 20的长度为" << sizeof(15.2 + 20) << endl;
// 关系运算中的类型转换
//因为计算(0 < a < 100从左到右,0 < a结果为false,隐式类型转化后为0,
// 0< 100结果为true
a = -1;
cout << ((0 < a < 100) ? "true" : "false") << endl;
cout<<((0<a&& a < 100) ? "true" : "false") << endl;
4.1强制类型转换
//强制类型转换
int total = 20, num = 6;
double avg = total / num;
cout << "avg = " << avg << endl;
//C语言风格
cout << "avg = " << (double)total / num << endl;
//C++函数调用风格
cout << "avg = " << double(total) / num << endl;
//C++强制类型转换运算符
cout << "avg = " << static_cast<double>(total) / num << endl;