5.1 算术操作符
在写代码时,一定会涉及到计算。为了方便运算,提供了一系列操作符,其中有一组操作符叫:算术操作符。分别是:+ - * / %,这些操作符都是双目操作符。
注:操作符也被叫做:运算符,是不同的翻译,意思是一样的。
#include <iostream>
using namespace std;
int main(){
int a = 7 + 2; // 加法运算
int b = 7 - 2; // 减法运算
int c = 7 * 2; // 乘法运算
int d = 7 / 2; // 除法运算,得到的是整除后的商
int e = 7 % 2; // 取余运算,得到的是整除后的余数
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
cout << e << endl;
return 0;
}
易错点: • / 除法的操作符,除数不能为 0,如果除数为 0,程序会崩溃的。 • % 取模操作符的计算结果是两个操作数进行除法运算后的余数。 • 取模操作符的操作数只能是整型,不能是浮点型,这个编译器会报语法错误的。
#include <iostream>
using namespace std;
int main(){
int a = 10;
int b = 0;
int c = a / b;
float d = 6.0;
float e = d % 2;
return 0;
}
5.2 浮点数的除法
#include <iostream>
using namespace std;
int main(){
float x = 6 / 4;
cout << x << endl; // 1
float y = 6.0 / 4; // 6/4.0结果是一样的
cout << y << endl; // 1.5
return 0;
}
上面示例中,尽管变量 x 的类型是 float(浮点数),但是 6 / 4 得到的结果是 1.0,而不是 1.5。原因就在于整数除法是整除,只会返回整数部分,丢弃小数部分。
如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时就会进行浮点数除法。
5.3 负数取模
• 负数也是支持取模的,但是负数求模结果的正负号由第一个运算数(操作数)的正负号决定
#include <iostream>
using namespace std;
int main(){
cout << 11 % -5 << endl; // 1
cout << -11 % -5 << endl; // -1
cout << -11 % 5 << endl; // -1
return 0;
}
5.4 数值溢出
前面我们了解到数据类型都有对应的数值范围,而在实际运算过程中可能会存在加法操作导致数据范围超过当前数据类型规定的范围,如下:
#include <iostream>
using namespace std;
int main(){
char a = 'Z';
char b = a + 'Z';
cout << b << endl; // 输出了不显示的内容
// printf 是格式化输出,后面章节会讲,这里暂不做讲解
printf("%d", b); // -76,char 的十进制内容
return 0;
}
以 char 类型为例,char 的数值范围在 -128 ~ 127,当字符相加超过最大值后,打印出来的结果会变成负数,这与数据的存储有关

意识到数据类型的取值是有其范围的,那么我们在编程的时候就要选择合适的数据类型,才能得到正确的结果。正所谓:十年 IO 一场空,不开 long long 见祖宗。
5.5 练习
练习 1:计算 (a+b)*c
链接:https://www.luogu.com.cn/problem/B2008
#include <iostream>
using namespace std;
int a, b, c;
int main(){
cin >> a >> b >> c;
int r = (a + b) * c;
cout << r << endl;
return 0;
}
练习 2:带余除法
链接:https://www.luogu.com.cn/problem/B2010
#include <iostream>
using namespace std;
int a, b;
int main(){
cin >> a >> b;
cout << a / b << " " << a % b << endl;
}
练习 3:整数个位
链接:https://ac.nowcoder.com/acm/problem/21990
#include <iostream>
using namespace std;
int a;
int main(){
cin >> a;
cout << a % 10 << endl;
return 0;
}
练习 4:整数十位
链接:https://ac.nowcoder.com/acm/problem/21991
#include <iostream>
using namespace std;
int a;
int main(){
cin >> a;
cout << a % 100 / 10 << endl;
return 0;
}
练习 5:时间转换
链接:https://ac.nowcoder.com/acm/contest/18839/1031
#include <iostream>
using namespace std;
int time;
int main(){
cin >> time;
cout << time / 60 / 60 << " " << time / 60 % 60 << " " << time % 60 << endl;
return 0;
}
解释:
- time 除以 60(1 分钟有 60 秒)先换算出分钟数,分钟数除以 60(1 小时有 60 分钟)交换算成小时。
- time 除以 60(1 分钟有 60 秒)先换算出分钟数,分钟数对 60 取模,就是换完小时后剩余的分钟数
- time 对 60 取模,每 60 秒凑 1 分钟,还剩多少多少秒,没办法凑够一分钟。
练习 6:小鱼的游泳时间
链接:https://www.luogu.com.cn/problem/P1425
#include <iostream>
using namespace std;
int main(){
int a, b, c, d;
cin >> a >> b >> c >> d;
int h, m;
int t = c * 60 + d - a * 60 - b; // 计算机出时间差,单位是分钟
h = t / 60;
m = t % 60;
cout << h << " " << m << endl;
return 0;
}
6.1 连续赋值
赋值操作符也可以连续赋值,如:
int a = 3;
int b = 5;
int c = 0;
c = b = a + 3; // 连续赋值,从右向左依次赋值的。
虽然支持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样方便观察代码的执行细节。
6.2 复合赋值符
在写代码时,我们经常可能对一个数进行自增、自减的操作,如下代码:
int a = 10;
a = a + 3;
a = a - 2;
这样代码 C++ 给提供了更加方便的写法:
int a = 10;
a += 3;
a -= 2;
C++ 中提供了复合赋值符,方便我们编写代码,这些赋值符有:

6.3 练习
练习:交换值
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=2064
#include <iostream>
using namespace std;
int main(){
int a = 0;
int b = 0;
cin >> a >> b;
int c = a; // c 是一个临时变量,作为中间变量实现交换的
a = b;
b = c;
cout << a << " " << b << endl;
return 0;
}

