赋值操作符
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
int a = 100; // 初始化
a = 200; // 赋值,这⾥使⽤的就是赋值操作符
赋值操作符 = 是⼀个随时可以给变量赋值的操作符,赋值运算符是把右边的值赋值给左边的,这个和数学中的书写习惯是不同的。
连续赋值
赋值操作符也可以连续赋值,如:
int a = 3;
int b = 5;
int c = 0;
c = b = a + 3; // 连续赋值,从右向左依次赋值的
虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执⾏细节。
int a = 3;
int b = 5;
int c = 0;
b = a + 3;
c = b;
这样写,在调试的时候,每⼀次赋值的细节都是可以很⽅便的观察的。
复合赋值符
在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:
int a = 10;
a = a + 3;
a = a - 2;
这样代码C++给提供了更加⽅便的写法:
int a = 10;
a += 3;
a -= 2;
C++中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
复合赋值符 | 样例 | 一般写法 |
---|---|---|
+= | a+=10 | a=a+10 |
-= | a-=10 | a=a-10 |
*= | a*=10 | a=a*10 |
/= | a/=10 | a=a/10 |
%= | a%=10 | a=a%10 |
>>= | a>>=1 | |
<<= | a<<=1 | |
&= | a&=10 | |
|= | a|=10 | |
^= | a^=10 |
练习
账户余额
小明账户有100元,经过了下面的操作:
- 往里面存了10元
- 购物花掉了20元
- 把里面的钱全部取出
请在每次操作后输出账户余额
#include <iostream>
using namespace std;int main()
{int x = 100;x += 10;cout << x << endl;x -= 20;cout << x << endl;x = 0;cout << x << endl;return 0;
}
交换值
#include <iostream>
using namespace std;int main()
{int a, b;cin >> a >> b;int tmp = a;a = b;b = tmp;cout << a << " " << b << endl;return 0;
}
类型转换
在使⽤C/C++写代码的过程中,不同类型的数据进⾏混合计算的时候,或者赋值时等号两边的类型不统⼀的时候,都会发⽣类型转换,这时就需要根据类型的转换规则转换成合适的类型。
混合运算时的类型转换
字符、整数、浮点数可以混合运算,在这种情况下⾸先要将不⼀致的数据类型进⾏转换,类型统⼀后才能进⾏计算。
这⾥边⼀般涉及两类转换:整型提升和算术转换。
- 整型提升:表达式之中的 char 和 short 类型⼀定会先转换成 int 类型,然后参与运算。
- 算术转换:表达式中出现下⾯的任意两种类型的值进⾏计算的时候,要先要将较下⾯的类型转换成另外⼀种类型才能计算。
long double
double
float
unsigned long int
long int
unsigned int
int
这些转换都是隐式⾃动发⽣的,有些编译器会报警告,写程序的⼈并没有感知到,也不需要操⼼细节
#include <iostream>
using namespace std; int main()
{ //案例1 char a = 'a'; int b = 10; char c = a + b; //这⾥a会发⽣整型提升,a+b的结果存放到c中,⼜发⽣截断//案例2 int c = 10; double d = 3.14; double e = c + d; //c+d的时候,这⾥c会发⽣算数转换,转换为double类型 return 0;
}
赋值时类型转换
当赋值操作符两端的数据类型不⼀致的时候,这时就需要类型转换,这种转换也是隐式⾃动发⽣的。
转换规则如下:
- float 和 double 赋值给 int ,直接截断⼩数部分,保留整数部分。
int a = 3.14; //这⾥a得到的是3
- 较⼩的类型转换较⼤类型,直接转换,值不变。
- 较⼤的类型转换较⼩的类型,⼀般会发⽣截断,按照较⼩类型的⻓度,保留低位数据给较⼩的类型。
这些转换都是隐式⾃动发⽣的,有些编译器会报警告,写程序的⼈并没有感知到,也不需要操⼼细节。
强制类型转换
在C/C++中也会有强制类型转换,根据实际的需要将某⼀数据的数据类型转换为指定的数据类型,强制类型转换是临时转换的,不影响变量本⾝的类型。语法形式如下:
(类型名)表达式double d = 3.14;
int a = (int)d;
上⾯的代码是将 double 类型的3.14转换成 int 类型的值,赋值给 a 。
练习
计算成绩
#include <iostream>
using namespace std;int a, b, c;
int ret;
int main()
{cin >> a >> b >> c;ret = (int)(a * 0.2 + b * 0.3 + c * 0.5);// 这⾥进⾏了强制类型转换,如果不转换,也会⾃动转换的cout << ret << endl;return 0;
}
B2016 浮点数向零舍入 - 洛谷
#include <iostream>
using namespace std;double x;
int main()
{cin >> x;cout << (long long)x << endl;// 题⽬给的数据较⼤,强制转换为int,存在漏洞return 0;
}
这⾥也要注意, -10^15 ≤ x ≤ 10^15 ,这个取值范围明显超过int的取值范围。
B2017 打印 ASCII 码 - 洛谷
#include <iostream>
using namespace std;int main()
{char a;cin >> a;cout << (int)a << endl;// 如果没有强制类型转换,编译器会认为c是字符类型,打印的依然是字符return 0;
}
B2018 打印字符 - 洛谷
#include <iostream>
using namespace std; int main()
{ int n = 0; cin >> n; cout << (char)n <<endl; // 利⽤强制类型转换,将ASCII码值按照字符类型打印 return 0;
}