当前位置: 首页 > news >正文

C++算术运算符与类型转换

1、算术运算符

C++当中提供5种基础的算术运算符:加法减法乘法除法取模

我们来看下代码:

1

2

3

4

5

6

7

inta = 10, b = 3;

cout << a + b << endl;// 13

cout << a - b << endl;// 7

cout << a * b << endl;// 30

cout << a / b << endl;// 3

cout << a % b << endl;// 1

前面三个都非常简单,着重讲下最后两种。

对于除法来说,我们要注意的是它是区分类型的。当我们的除数和被除数都是整数的时候,得到的结果也会是一个整数。所以10 ➗ 3得到的结果就是3,它的小数部分会被抛弃。想要得到小数结果,只需要除数或者被除数当中有一个是浮点型即可。

取模运算符求的就是一个数除以另外一个数之后的余数。这里要注意,在其他语言当中并没有对取模运算的限制,而在C++当中,严格限制了取模运算的对象只能是整数。

否则编译的时候会报错:

2、优先级

C++当中算术运算符的优先级和我们从小数学课本里是一样的,先乘除再加减。

如:

1

2

3

3 + 4 * 5;// 23

120 / 4 * 5;// 150

20 * 5 + 4 * 6;// 124

即当乘除法和加减法同时出现时,先算乘除后算加减。如果有多个运算符同样优先级,那么先左后右。

3、类型转换

前面说了,同样是除法,根据除数和被除数类型的不同,得到的结果也不同。这样固然非常灵活,但是除了更加复杂给学习、使用者带来负担之外,也会使得计算机的操作更加复杂。

比如我们一共有11种整型和3种浮点型,那么我们在计算的时候就会出现大量不同的情况。比如short + shortshort + intshort + double等等,那么编译器就需要对这么多种情况都进行处理,这显然是非常麻烦的。为了解决这个问题,C++会自动执行许多类型转换。

下面我们对这些情况进行一一讨论。

初始化和赋值时的转换

当我们对某个值进行初始化或者赋值的时候,C++会自动将赋予的值转化成接收者的类型。

比如:

1

2

floata = 3.5f;

doubleb = a;

在上面这个例子当中,我们将一个float类型的变量a赋值给了double类型的b。那么编译器会将a的值拓展成64位的double再赋值给b。也就是说不会影响b的类型。

这样将长度更短的变量转化成更长变量的类型转换除了多占用一点内存之外,不会导致什么问题。但反向操作可能就会出错,

比如:

1

2

longlonga = 0x3f3f3f3f3f3f3f;

intb = a;

在上面的例子当中,我们将一个long long赋值给了int,由于a的数值非常大超过了int能够承载的范围,进行这样的赋值之后,编译器并不会报错(甚至不会有警告),但将会导致结果错误。b变量将不可能再和a变量相等。

再比如将float变量赋值给int的时候,同样也会有类似的问题,所以在进行赋值的时候,当两个变量的类型不同时,千万要当心。

使用花括号进行转换

这是C++ 11的新特性,使用大括号进行初始化,这种操作被称为列表初始化。

这种方式的好处和坏处都很明显,好处是它不允许变量长度缩窄的情况,坏处则是又增加了学习的成本。例如,不允许将浮点型转换成整型。在不同的整型之间以及整型转化成浮点型的操作可能被允许,取决于编译器知道目标变量能够正确地存储赋给它的值。比如可以将int类型赋值给long,因为long总是至少与int一样长,反向操作则会被禁止。

1

2

3

4

5

inta = 0x3f3f3f3f;

longb = {a};// 允许

longa = 0x3f3f3f3f;

intb = {a};// 禁止

关于列表初始化,C++ primer当中还列举了一个非常有意思的case

1

2

3

4

5

6

7

8

9

10

11

constintx = 55;

charc = {x};// 允许

intx = 55;

charc = {x};// 禁止

constintx = 1255;

charc = {x};// 禁止

constintx = 1255;

charc = x;// 允许会警告

这是为什么呢?因为我们加了const修饰之后,编译器就明确知道了x的值,就等于55,它在char类型的范围内,所以允许将它转化成char。如果不加const,那么在编译器看来x是一个int型的变量,它的范围要大于char,所以会禁止。即使我们加了const修饰,如果x的值过大,超过char的范围,也同样会被禁止。

4、表达式中转换

当一个表达式当中出现多个变量类型的时候,C++也会进行转换。由于可能涉及的情况非常多,使得这个转换的规则也会比较复杂。

表达式时C++会将boolcharunsigned charsigned charshort全部转换为int
对于bool类型来说,true会被转化成1,false转换成0,其他类型的转换应该都很好理解,都是将范围更小的变量转化成范围更大的int,这种转换称作整型提升。因为通常int类型都是计算机最自然的类型,也意味着计算机在处理int的时候,处理的速度最快。

将不同类型进行运算的时候,也会做一些转换。比如将intfloat相加的时候,由于涉及到两种类型,其中范围较小的那个会被转换成较大的类型。比如如果我们计算9.0 / 5,那么编译器会先将5转化成5.0,再进行除法运算,这样得到的结果自然也是一个double

C++11的规范中除了一个类型转换的校验表,我们可以参考一下校验表理解一下类型转换的过程。

  • 如果有一个数类型是long double,则将另外一个数也转成long double
  • 否则,如果有一个数类型是double,则将另外一个数也转成double
  • 否则,如果有一个数类型是float,则将另外一个数也转成float
  • 否则说明所有操作数都是整数,执行整型提升


http://www.jsqmd.com/news/711870/

相关文章:

  • 量子计算中单量子位门分解技术与TAQR算法解析
  • Linux RT 调度器的 set_next_task:下一个 RT 任务的设置
  • 构建跨AI助手的记忆层:mem0-chrome-extension项目深度解析
  • 2026年3月市面上优质的方轨品牌口碑推荐,微型滚珠丝杆/滚珠丝杠螺母座/直线滑块/直线导轨,方轨实力厂家哪家好 - 品牌推荐师
  • 2026年制造业生产流程优化AI方案全解析:架构师视角的厂商横评与落地指南
  • 化学推理模型评估与Chem-R架构解析
  • Tailwind CSS如何使用自定义SVG图标_利用mask-image与currentColor
  • 浙大最新Nat Neurosci:人脑像GPT一样处理语言吗?揭示人类语言预测的“精度与效率权衡”
  • SeeAct项目解析:基于大语言模型的多模态具身智能实现
  • 终极一键式Steam游戏清单下载器:3步轻松搞定游戏管理
  • 冰墙反射效果:混合法线贴图技术解析
  • Remix路由匹配的奥秘:事件和服务的解析
  • 从GDAL报错到亚米级解译精度,Python遥感AI pipeline全链路调试手册,含27个真实报错代码片段及修复逻辑
  • 跨平台Unity资源编辑器实战指南:快速掌握游戏MOD制作技巧
  • 视觉嵌入模型的组合泛化能力解析
  • LSTM状态管理机制与Keras实战指南
  • 七秩航天 苍穹交响 | 2026航天文化之夜成都圆满落幕,全矩阵布局航天文化新生态
  • 自主编码框架解析:从AI编程助手到闭环开发系统
  • 格灵深瞳年营收1.6亿:扣非后净亏2亿 赵勇控制27%股权
  • LangGraph 入门全解析
  • Hugging Face Auto Classes:简化模型加载与管理的核心技术
  • 2026年Q2成都地区绝缘电线厂家综合实力排行 - 优质品牌商家
  • GHelper终极指南:华硕笔记本轻量级性能控制解决方案
  • 2026年FDA注册防驳回服务商TOP5排行:玩具检测、第三方检测机构、运输条件鉴定书、食品FDA、CE认证、COA报告选择指南 - 优质品牌商家
  • 【12.MyBatis源码剖析与架构实战】11.嵌套查询循环引⽤源码剖析
  • 轻松掌握Windows和Office激活:新手也能上手的完整指南
  • 毕设选题避坑:这 5 类题目千万不要选,谁选谁挂
  • 终极指南:GHelper手动风扇控制如何让你的ROG笔记本实现静音与性能完美平衡
  • 告别漏报!Log4j2Scan插件v0.13的延迟检测与缓存机制详解
  • 嵌入式C实时采集系统崩溃日志解密:解析HardFault_Handler中隐藏的栈溢出+浮点异常+未对齐访问三重叠加故障(含GDB脚本)