一、算术操作符
1.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 , 程序会奔溃
- % : 取余操作符的计算结果是两个操作数进行除法运算后的余数。
- 取余操作符的操作数只能是整型 , 不能是浮点型 , 否则编译器会报语法错误。
1.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 。 原因就在于 : 整数除法是整除,只会返回整数部分,丢弃小数部分。如果希望得到浮点数的结果,两个运算数 必须至少有⼀个浮点数, 这时就会进行浮点数除法。
1.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;
}
1.4 数值溢出
实际运算过程中可能会存在加法操作导致数据范围超过当前数据类型规定的范围,如下:
#include <iostream>
using namespace std;
int main()
{
char a = 'Z'; //90
char b = a + 'Z';//90+90 = 180
cout << b << endl; // 输出了不显示的内容
printf("%d", b); // -76,char的十进制内容
return 0;
}
以 char 类型为例, char 的数值范围在 -128 ~ 127 ,当字符相加超过最大值后,打印出来的结果会变成负数,这与数据的存储有关。
意识到数据类型的取值是有其范围的,那么我们在编程的时候就要选择合适的数据类型,才能得到正确的结果。正所谓:十年 IO ⼀场空,不开 long long 见祖宗。
1.5 练习
练习一 : 计算(a+b)*c
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
cin >> a >> b >> c;
int ret = ( a + b ) * c;
cout << ret << endl;
return 0;
}
注意:
这个题目一定要注意,数据范围, −10^ 4 < a, b, c < 10^4 ,(a+b)*c的结果也不会超过有符号 整型的最大值, 而如果取值范围变成 −10^5 < a, b, c < 10 ^5 ,就需要使用 long long 类型 了。 做题的时候⼀定要多留意数据范围。
练习二:带余除法
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a/b << " " << a%b << endl;
return 0;
}
练习三:整数个位
整数 % 10 ----> 得到个位数
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n ;
cout << n % 10 << endl;
return 0;
}
练习四 : 整数十位
( 整数 / 10 ) % 10 ----> 得到十位数
#include <iostream>
using namespace std;
int main()
{
int a = 0;
cin >> a;
cout << (a / 10) % 10 << endl;
return 0;
}
练习五:时间转换
1. time除以60(1分钟有60秒)先换算出分钟数,分钟数除以60(1小时有60分钟)交换算成小时。2. time除以60(1分钟有60秒)先换算出分钟数,分钟数对60取模,就是换完小时后剩余的分钟数3. time对60取模,每60秒凑1分钟,还剩多少多少秒,没办法凑够⼀分钟。秒数 / 60 / 60 ----> 小时数秒数 / 60 % 60 ----> 分钟数秒数 % 60 ----> 剩余秒数
#include <iostream>
using namespace std;
int main() {
int sec = 0;
cin >> sec;
cout << sec / 60 / 60 << " " << sec / 60 % 60 << " " << sec % 60 << endl;
return 0;
}
练习六:小鱼的游泳时间
1 . 先计算出 分钟差
2 . 已知分钟 求 x小时 y 分 ---> 分钟数 / 60 小时 分钟数 % 60 分钟
#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;
}
二、赋值操作符
在变量创建的时候给⼀个初始值叫 初始化 , 在变量创建好后,再给一个值,这叫 赋值 。int a = 100 ; // 初始化a = 200 ; // 赋值,这里使用的就是赋值操作符赋值操作符 = 是一个随时可以给变量赋值的操作符,赋值运算符是把右边的值赋值给左边的,这个和数学中的书写习惯是不同的。
2.1 连续赋值
赋值操作符也可以连续赋值,如:
#include <iostream>
using namespace std;
int main()
{
int a = 3;
int b = 5;
int c = 0;
c = b = a + 3; //连续赋值,从右向左依次赋值的。
return 0;
}
虽然支持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样方便观察代码的执行细节。同时,在调试的时候,每⼀次赋值的细节都是可以很方便的观察的。
#include <iostream>
using namespace std;
int main()
{
int a = 3;
int b = 5;
int c = 0;
b = a + 3;
c = b ;
return 0;
}
2.2 复合赋值符
对⼀个数进行自增、自减的操作,如下代码:int a = 10 ;a = a + 3 ;a = a - 2 ;这样代码C++给提供了更加方便的写法:int a = 10 ;a += 3 ;a -= 2 ;使用复合赋值操作符能够让代码更简洁,但需要注意,不要一味地追求代码简洁,过于简洁的代码在可读性上会差⼀些。C++中提供了复合赋值符,方便我们编写代码,这些赋值符有:
2.3 练习
练习一 : 账户余额
⼩明账户有100元,经过了下面的操作:1 . 往里面存了10元2 . 购物花掉了20元3. 把里面的钱全部取出请在每次操作后输出账户余额:
#include <iostream>
using namespace std;
int main()
{
int balance = 100;
balance += 10;
cout << balance << endl;
balance -=20;
cout << balance << endl;
balance = 0;
cout << balance << endl;
return 0;
}
练习二 : 交换值
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
int c = a;
a = b;
b = c;
cout << a << " " << b << endl;
return 0;
}
三、类型转换
在使用 C/C++ 写代码的过程中,不同类型的数据进行混合计算的时候,或者赋值时等号两边的类型不统一的时候,都会发生类型转换,这时就需要根据类型的转换规则转换成合适的类型。
3.1 混合运算时的类型转换
字符、整数、浮点数可以混合运算 ,在这种情况下首先要将不⼀致的数据类型进行转换,类型统⼀后才能进行计算。这里边⼀般涉及两类转换: 整型提升和算术转换。
这些转换都是隐式自动发生的,有些编译器会报警告,写程序的人并没有感知到,也不需要操心细节。
#include <iostream>
using namespace std;
int main()
{
//案例1
char a = 'a';
int b = 10;
char c = a + b;
//案例2
int c = 10;
double d = 3.14;
double e = c + d;
return 0;
}
3.2 赋值时的类型转换
当 赋值操作符两端的数据类型不一致的时候 ,这时就需要类型转换,这种转换也是隐式自动发生的。转换规则如下:
3.3 强制类型转换
例如:
double d = 3.14;int a = (int)d;上面的代码是将 double 类型的 3.14 转换成 int 类型的值,赋值给 a 。
3.4 练习
练习一 : 计算成绩
#include <iostream>
using namespace std;
int main()
{
int a,b,c = 0;
int ret = 0;
cin >> a >> b >> c;
ret = (int)(a*0.2 + b*0.3 + c*0.5);
cout << ret << endl;
return 0;
}
练习二 : 浮点数向零舍入
#include <iostream>
using namespace std;
double x;
int main()
{
cin >> x;
cout << (long long)x << endl;
return 0;
}
练习三 : 打印字符ASCII
#include <iostream>
using namespace std;
char c;
int main()
{
cin >> c;
cout << (int)c << endl;
return 0;
}
练习四 :打印字符
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
char c = n;
cout << c << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
cout << (char)n << endl;
return 0;
}
四、单目操作符
前面介绍的操作符都是双目操作符,即有2个操作数。除此之外还有⼀些操作符只有⼀个操作数,被称 为单目操作符。如 ++、--、+(正)、-(负) 就是单目操作符。
4.1 ++ 和 --
4.2 前置++ 和 后置++
前置++ : 先+1 , 后使用
后置++ : 先使用 , 后+1
前置++:
#include <iostream>
using namespace std;
int main()
{
//案例1
int x = 10;
int a = ++x;
cout << x << " " << a << endl;
}
后置++:
#include <iostream>
using namespace std;
int main()
{
//案例2
int x = 10;
int a = x++;
cout << x << " " << a << endl;
return 0;
}
4.3 前置-- 和 后置 --
前置-- : 先-1 , 后使用
后置-- : 先使用 , 后-1
前置-- :
#include <iostream>
using namespace std;
int main()
{
//案例1
int y = 10;
int b = --y;
cout << y << " " << b << endl;
return 0;
}
后置-- :
#include <iostream>
using namespace std;
int main()
{
//案例2
int y = 10;
int b = y--;
cout << y << " " << b << endl;
return 0;
}
4.4 + 和 -
+ 是正号, - 是负号,都是单目操作符。1. 运算符 + 对正负值没有影响,是一个完全可以省略的运算符,但是写了也不会报错。2. 运算符 - 用 来改变一个值的正负号,负数的前面加上 - 就会得到正数,正数的前面加上 - 会得到负数。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = -a;
int c = -10;
cout << b << " " << c << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int a = -10;
int b = -a;
cout << b << endl;
return 0;
}