C++入门(三) (算法竞赛)

🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!
🔭个人主页:散峰而望
🚀学习方向: C/C++等方向
📌专栏系列:
- 📖《C语言:从基础到进阶》
- 📚《编程工具的下载和使用》
- 🚀《C语言刷题》
- ⚖️《算法竞赛从入门到获奖》
💬人生格言:冀以尘雾之微,补益山海,荧烛末光,增辉岁月。
🎬博主简介



文章目录
- 前言
- 算术操作符
- 5.1 算数操作符
- 5.2 浮点数的除法
- 5.3 取模
- 5.4 数值溢出
- 5.5 练习
- 6. 赋值操作符
- 6.1 定义
- 6.2 连续赋值
- 6.3 复合赋值符
- 6.3 练习
- 7. 类型转换
- 7.1混合运算时的类型转换
- 7.2 赋值时类型转换
- 7.3 强制类型转换
- 7.4 练习
- 8. 单目操作符
- 8.1 ++和--
- 8.1.1 前置++和后置++
- 8.1.2 前置--后置--
- 8.2 +和-
- 结语
前言
我们在前面已经对C++程序有着基础的认知,对数据结构与变量和常量也有所了解。接下来将会对算数操作符、赋值操作符等进行一一了解,为接下来的C++输入输出做好准备。
算术操作符
5.1 算数操作符
在写代码时候,一定会涉及到计算。为了方便运算,提供了一系列操作符,其中有一组操作符叫:算术操作符。分别是:+ - * / %,这些操作符都是双目操作符。
注:操作符也被叫做:运算符,是不同的翻译,意思是一样的。
代码如下:
#include <iostream>
using namespace std;
int main()
{int a = 5 + 2; //加法运算 int b = 5 - 2; //减法运算 int c = 5 * 2; //乘法运算 int d = 5 / 2; //除法运算,得到的是整除后的商 int e = 5 % 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; // 1float y = 6.0 / 4; // 6/4.0结果是一样的 cout << y << endl; // 1.5return 0;
}

上面示例中,尽管变量x的类型是float(浮点数),但是6 / 4得到的结果是1.0,而不是1.5。原因就在于整数除法是整除,只会返回整数部分,丢弃小数部分。哪怕定义为浮点数,也会输出的值为整数。
如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时就会进行浮点数除法。
当然,如果你定义的为int,哪怕你两边都有浮点数,都没有用。代码如下:
int main()
{float x = 6 / 4;cout << x << endl; // 1int y = 6.0 / 4; // 6/4.0结果是一样的 cout << y << endl; // 1.5return 0;
}

如果规定输入为整数,但是除法后得到的值必须为浮点型,那我们该怎么做?
- 强行转换(后面会讲,不过不推荐)
- 乘以一个浮点型1.0就行了,代码如下:
int main()
{int a = 5;float f = a * 1.0 / 4;//1.25float b = a / 4;//1cout << f << endl;cout << b << endl;return 0;
}

5.3 取模
%取模的操作符的计算结果是两个操作数进行除法运算后的余数。
- 取模操作符的操作数只能是整型,不能是浮点型。
- 负数求模结果的**正负号由第一个运算数(操作数)**的正负号决定。代码如下:
int main()
{cout << 9 % -4 << endl; // 1cout << -9 % -4 << endl; // -1cout << -9 % 4 << endl; // -1return 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,当字符相加超过最大值后,打印出来的结果会变成负数,这与数据的存储有关,感兴趣的同学可以拓展学习。当然与数据的存储相关内容后面会讲。
当然我们也可以不用printf表示,可以对b的类型强制转换一下。代码如下:

第一行无法输出是因为超出char的数值范围,所以转换为整型来表示。可以看到打印的为-76,说明数值溢出了76,具体可以参考下图进行了解:

提示:可以类推其他类型
意识到数据类型是有范围的,如果选错范围也会造成不小的影响,所以要大致记一下各数据类型的取值范围。编程只有选择合适的数据类型,才能得到真确的结果。
5.5 练习
了解算数操作符,那么来几道题趁火打铁一并练习一下吧!练习题过两天会详细的进行讲解。
计算 (a+b)×c 的值
整数的十位
时间转换
6. 赋值操作符
6.1 定义
在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给一个值,这叫赋值。
int a = 100; //初始化
a = 200; //赋值
赋值操作符=是一个随时可以给变量赋值的操作符,赋值运算符是把右边的值赋值给左边的,和数学中的书写习惯是不同的。
6.2 连续赋值
赋值操作符也可以连续赋值,代码如下:
int a = 1;
int b = 2;
int c = 0;
c = b = a + 3; //连续赋值,从右向左依次赋值
虽然支持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样方便观察代码的执行细节。
int a = 1;
int b = 2;
int c = 0;
b = a + 3;
c = b;
这样写,在调试的时候,每一次赋值的细节都是可以很方便的观察的。
6.3 复合赋值符
写代码时,我们经常可能对一个数进行自增、自减的操作,如下代码:
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 = a >> 1 |
| <<= | a <<= 1 | a = a << 1 |
| &= | a &= 10 | a = a & 10 |
| ^= | a ^= 10 | a = a ^ 10 |
|=,a |= 10,a = a | 10(由于文本编辑器问题,所以在这里展示)
6.3 练习
了解赋值操作符,那么来几道题趁火打铁一并练习一下吧!练习题过两天会详细的进行讲解。
交换值
7. 类型转换
使用C/C++写代码的过程中,不同类型的数据进行混合计算的时候,或者赋值时等号两边的类型不统一的时候,都会发生类型转换,这时就需要根据类型的转换规则转换成合适的类型。
7.1混合运算时的类型转换
字符、整数、浮点数可以混合运算,在这种情况下首先要将不一致的数据类型进行转换,类型统一后才能进行计算。
这里边一般涉及两类转换:整型提升和算术转换。
-
整型提升:表达式之中的char和short类型一定会先转换成int类型,然后参与运算。
-
算术转换:表达式中出现下面的任意两种类型的值进行计算的时候,要先要将较下面的类型转换成另
外一种类型才能计算。
long double ^
double |
float |向
unsigned long int |上
long int |转
unsigned int |换
int |
这些转换都是隐式自动发生的,不需要操心细节。
int main()
{char a = 'a';int b = 10;char c = a + b; //这里a会发生整型提升,a+b的结果存放到c中,又发生截断 cout << c << endl;int c = 10;double d = 3.14;double e = c + d; //c+d的时候,这里c会发生算数转换,转换为double类型 cout << e <<endl;return 0;
}

7.2 赋值时类型转换
当赋值操作符两端的数据类型不一致的时候,这时就需要类型转换,这种转换也是隐式自动发生的。转换规则如下:
- float和double赋值给int,直接截断小数部分,保留整数部分。
int a = 3.14;//这里a得到的是3
- 较小的类型转换较大类型,直接转换,值不变。
- 较大的类型转换较小的类型,一般会发生截断,按照较小类型的⻓度,保留低位数据给较小的类型。
这些转换都是隐式自动发生的,有些编译器会报警告,写程序的人并没有感知到,也不需要操心细节。
7.3 强制类型转换
在C/C++中也会有强制类型转换,根据实际的需要将某一数据的数据类型转换为指定的数据类型,强制类型转换是临时转换的,不影响变量本身的类型。语法形式如下:
(类型名)表达式
double d = 3.14;
int a = (int)d;
上面的代码是将double类型的3.14转换成int类型的值,赋值给a。
7.4 练习
了解类型转换,那么来几道题趁火打铁一并练习一下吧!练习题过两天会详细的进行讲解。
成绩
浮点数向零舍入
打印 ASCII 码
8. 单目操作符
前面介绍的操作符都是双目操作符,即有2个操作数。除此之外还有一些操作符只有一个操作数,被称为单目操作符。如++、–、+(正)、-(负) 就是单目操作符。
8.1 ++和–
++是一种自增的操作符,又分为前置++和后置++,–是一种自减的操作符,也分为前置–和后置–
注意:
- 前置++ 或者后置++,都是让操作数自增1的
- 前置-- 或者后置–,都是让操作数自减1的
8.1.1 前置++和后置++
int x = 10;
int a = ++x; //++的操作数是x,是放在x的前面的,就是前置++
cout << x << " " << a << endl;int x = 10;
int a = x++; //++的操作数是x,是放在x的后面的,就是后置++
cout << x << " " << a << endl;
技巧:
前置++:先+1,后使用
后置++:先使用,后+1
8.1.2 前置–后置–
int y = 10;
int b = --y; //--的操作数是y,是放在y的前面的,就是前置--
cout << y << " " << b << endl;int y = 10;
int b = y--; //--的操作数是y,是放在y的后面的,就是后置--
cout << y << " " << b << endl;
技巧:
前置–:先-1,后使用
后置–:先使用,后-1
8.2 +和-
这里的+是正号,-是负号,都是单目操作符。
运算符+对正负值没有影响,是一个完全可以省略的运算符,但是写了也不会报错。
int a = +10; //等价于 int a = 10;
运算符-用来改变一个值的正负号,负数的前面加上-就会得到正数,正数的前面加上-会得到负数。
int a = 10;
int b = -a;
int c = -10;
cout << b << c << endl; //这里的b和c都是-10
int a = -10;
int b = -a;
cout << b << endl; //这里的b是10
结语
至此,C++入门(算法竞赛)已完结撒花。希望这篇文章可以助各位敲开算法竞赛的大门,初识C++的奥秘,去探寻算法世界的精妙。接下来我们就要深入C++的输入输出,期待各位前来学习。
同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。


