No.6十六届蓝桥杯备战|赋值操作符|连续赋值|复合赋值|类型转换|强制|混合|赋值(C++)

赋值操作符

在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。

c++ 复制代码
int a = 100;    // 初始化  
a = 200;        // 赋值,这⾥使⽤的就是赋值操作符

赋值操作符 = 是⼀个随时可以给变量赋值的操作符,赋值运算符是把右边的值赋值给左边的,这个和数学中的书写习惯是不同的。

连续赋值

赋值操作符也可以连续赋值,如:

c++ 复制代码
int a = 3;  
int b = 5;  
int c = 0;  
c = b = a + 3;      // 连续赋值,从右向左依次赋值的

虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执⾏细节。

c++ 复制代码
int a = 3;  
int b = 5;  
int c = 0;  
b = a + 3;
c = b;

这样写,在调试的时候,每⼀次赋值的细节都是可以很⽅便的观察的。

复合赋值符

在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:

c++ 复制代码
int a = 10;  
a = a + 3;  
a = a - 2;

这样代码C++给提供了更加⽅便的写法:

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元
  • 把里面的钱全部取出
    请在每次操作后输出账户余额
c++ 复制代码
#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;
}
交换值
c++ 复制代码
#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 类型,然后参与运算。
  • 算术转换:表达式中出现下⾯的任意两种类型的值进⾏计算的时候,要先要将较下⾯的类型转换成另外⼀种类型才能计算。
c++ 复制代码
long double  
double  
float  
unsigned long int  
long int  
unsigned int  
int

这些转换都是隐式⾃动发⽣的,有些编译器会报警告,写程序的⼈并没有感知到,也不需要操⼼细节

c++ 复制代码
#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;  
}
赋值时类型转换

当赋值操作符两端的数据类型不⼀致的时候,这时就需要类型转换,这种转换也是隐式⾃动发⽣的。

转换规则如下:

  1. float 和 double 赋值给 int ,直接截断⼩数部分,保留整数部分。
c++ 复制代码
int a = 3.14;   //这⾥a得到的是3
  1. 较⼩的类型转换较⼤类型,直接转换,值不变。
  2. 较⼤的类型转换较⼩的类型,⼀般会发⽣截断,按照较⼩类型的⻓度,保留低位数据给较⼩的类型。
    这些转换都是隐式⾃动发⽣的,有些编译器会报警告,写程序的⼈并没有感知到,也不需要操⼼细节。
强制类型转换

在C/C++中也会有强制类型转换,根据实际的需要将某⼀数据的数据类型转换为指定的数据类型,强制类型转换是临时转换的,不影响变量本⾝的类型。语法形式如下:

c++ 复制代码
(类型名)表达式

double d = 3.14;  
int a = (int)d;

上⾯的代码是将 double 类型的3.14转换成 int 类型的值,赋值给 a 。

练习

计算成绩
c++ 复制代码
#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 浮点数向零舍入 - 洛谷
c++ 复制代码
#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 码 - 洛谷
c++ 复制代码
#include <iostream>
using namespace std;

int main()
{
    char a;
    cin >> a;
    cout << (int)a << endl;
    // 如果没有强制类型转换,编译器会认为c是字符类型,打印的依然是字符

    return 0;
}
B2018 打印字符 - 洛谷
c++ 复制代码
#include <iostream>  
using namespace std;  

int main()  
{  
	int n = 0;  
	cin >> n;  
	cout << (char)n <<endl; 
	// 利⽤强制类型转换,将ASCII码值按照字符类型打印  
	
	return 0;  
}
相关推荐
17´8 分钟前
从0到机器视觉工程师(五):C++设计模式
开发语言·c++·设计模式
小鹏编程13 分钟前
C++和Python中负数取余结果的区别
c++·python
鲁班相信爱情24 分钟前
Qt: 无法运行rc.exe
c++·qt
重生之我是数学王子29 分钟前
使用Qt实现json数据的格式检测并序列化输出 Qt5.4.0环境
c++·qt·json
Ritsu栗子32 分钟前
代码随想录算法训练营day23
c++·算法
~糖炒栗子~33 分钟前
[Day 12]904.水果成篮
数据结构·c++·算法·leetcode
Adunn34 分钟前
算法基础 - 二分查找
数据结构·c++·算法
HUT_Tyne26535 分钟前
力扣--283.移动零
数据结构·算法·leetcode
ALISHENGYA36 分钟前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)
开发语言·数据结构·c++·算法
久睡成瘾.44637 分钟前
《代码随想录》Day29打卡!
数据结构·算法