【C++】表达式中各类数值型数据间的混合运算
注意:以下内容摘自文献[1],修改了部分内容。
1.运算中各类型数据转换方向如下:
| 高 | double | ← | float |
| ↑ | ↑ | ||
| | | long | ||
| | | ↑ | ||
| | | unsigned | ||
| | | ↑ | ||
| 低 | int | ← | char, short |
其中,横向的箭头表示必定的转换,即使是两个char型的数据相加减,每个数都先转换为int,然后在运算;纵向箭头表示当运算对象为不同类型时转换的方向。例如int型与double数据进行运算时,先将int型转换为double型,然后在两个double型数据间进行运算,结果为double型。 P31[1] (从取值范围来看,刚好是从小到大)
2.下面一个例子:
// 20191009.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <typeinfo>
using namespace std; int main()
{
system("color 3f");
char a = ;
int b = ;
cout << "type(a):" << typeid(a).name() << endl;
cout << "type(b):" << typeid(b).name() << endl;
cout << "type(a+b):" << typeid(a + b).name() << endl;
a += b;
cout << "a += b; type(a):" << typeid(a).name() << endl;
double c;
cout << "type(c):" << typeid(c).name() << endl;
c = a + b;
cout << "c = a + b; type(c):" << typeid(c).name() << endl;
system("pause");
return ;
}
运行结果如图:

(1) 在a是char型,b是int型,执行“a+b”时,必然发生将char型和float型转换成int型,而a和b中取值范围最大的是int,所以执行“a+b”相当于执行“int(a) + int(b)”,结果是int型;
(2) a += b 相当于a = a + b;由于赋值运算符“=”优先级小于算术运算符“+”,故 先执行“a+b”(优先级大小可查阅~ 【C++】运算符优先级和结合性),“a+b”上面已经得到,其结果是int型,接下来进行赋值运算由于a是char型,但是a+b结果是int型,故将int型数据赋值给char型数据,在VC++ 6.0中,char占一个字节,int型占4个字节,故将(a+b)的低8位赋值给char型的a,注意此时将取值范围大的变量赋值给取值范围小的变量有可能发生“截断”或者“溢出”。(赋值过程中的类型转换可查阅~【C++】赋值过程中的类型转换)
(3) 同样的,=优先级低于+,故先执行算术运算,int型的(a + b) 赋值给double型的c,取值范围小的赋值给取值范围大的,不会发生“截断”。
注意:执行赋值运算时,可考虑变量在内存中存储的二进制数,即将二进制赋值给其他变量,这样就比较好理解。
参考文献
[1]谭浩强.C++程序设计[M].北京:清华大学出版社.
【C++】表达式中各类数值型数据间的混合运算的更多相关文章
- 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)
记得上<数据结构>课程时,利用栈的特性解决过四则混合运算表达式.而如今在编写小型关系数据库的时候,编译部分要处理where后面的逻辑表达式——检查语法正确与否的同时,还要将信息传给下一个接 ...
- SQL 中数值型数据截取以及四舍五入
SQL 中数值型数据截取及四舍五入 例一: -- 将两个数值分别截取只保留两位小数 ( 注意此时字段默认为 decimal ) select CAST ( 10.097 as decimal ( 10 ...
- 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)
package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...
- shell脚本中各类括号的作用(小结)
技巧小结: 字符串比较用双中括号[[ ]]:算数比较用单中括号[ ]——左右留空格 算数运算用双小括号(( )) :shell命令及输出用小括号( )——左右不留空格 快速替换用花括号{ }——左右留 ...
- No.5 表达式中的陷阱
1. 关于字符串的陷阱 JVM对字符串的处理 String java = new String("Java"); 创建了几个对象? 2个."Java"直接量对应 ...
- 第一百节,JavaScript表达式中的运算符
JavaScript表达式中的运算符 学习要点: 1.什么是表达式 2.一元运算符 3.算术运算符 4.关系运算符 5.逻辑运算符 6.*位运算符 7.赋值运算符 8.其他运算符 9.运算符优先级 E ...
- shell中的数值运算
By francis_hao Oct 2,2017 本文摘录自bash的man手册. 算数运算相关的形式 形式 含义 ((expression)) expression按照下面描述的算术 ...
- Shell基础(二):Shell中的数值运算、条件测试操作、使用if选择结构
一.Shell中的数值运算 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 使用expr.$[ ].let等整数运算工具:定义变量X=1234,然后计算X与78 ...
- Python中的数值类型总结
本文参考书:<Learning Python>中文版--<Python 学习手册>第四版 Python中包含大量的数值类型,他们中的大部分与其他编程语言保持一致,因此学习他们就 ...
随机推荐
- Nginx模块开发(3)————使用upstream访问第三方服务
该模块可以完成如下的功能,当我们输入http://你的ip/lcwupstream时,会使用upstream方式访问淘宝搜索,打开淘宝搜索的主页面,代码如下: //start from the ver ...
- centos7 源码安装goaccess
1. 使用yum安装在不同服务器上可能失败, 推荐使用源码安装goaccess # 安装依赖 yum install -y ncurses-devel GeoIP-devel.x86_64 tokyo ...
- jenkins 安装成功之后配置
一.基础配置介绍 jenkins安装成功之后如果某些东西配置的话,可能部署的时候一堆的问题,所以单独总结一下,让大家少走弯路 二.准备工作 1.需要准备一台服务器,大家可以在网上买,个人学习的话还是建 ...
- CSS设置table样式
\(\color{purple}{表格是个很重要的东西,让我们来美化一下吧!}\) table{ width:290px;height:300px; border:1px solid black;/* ...
- IDOC日志查询报表
当不知道IDOC同步的具体时间,而WE02数据量过大时: 当某条IDOC记录中数据量过大,找不到具体某条数据时: 可采用自开发程序查找,具体代码如下: REPORT ZIDOC_LOG. *----- ...
- HMM-前向后向算法与实现
目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...
- Luogu P3846 BSGS算法
https://www.luogu.com.cn/problem/P3846 BSGS这个东西是用来干啥的? 形如下面这个式子: \[a^b = c\;(mod\;p) \] 其中:p是一个质数.\( ...
- IDC预测2020云服务逆势增长!云服务器已成上云首选
IDC预测2020云服务逆势增长!云服务器已成上云首选 据IDC最新预测指出,2020年IT基础设施支出今年将增长约4%,达到2370亿美元,驱动力主要来源于云服务. 受疫情的影响,不少企业开源节流, ...
- 【雕爷学编程】MicroPython动手做(03)——零基础学MaixPy之开机测试
1.几个知识点(1)MicroPython 是 Python 3 语言的精简高效实现 ,包括Python标准库的一小部分,并针对嵌入式微控制器(单片机)和受限制的环境进行了优化,它是Python延伸出 ...
- Oracle百万数据查询语句
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT id, name, age, birthDate, sex, describe, city, cre ...