【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中包含大量的数值类型,他们中的大部分与其他编程语言保持一致,因此学习他们就 ...
随机推荐
- 数学--数论--HDU-2698 Maximum Multiple(规律)
Given an integer nn, Chiaki would like to find three positive integers xx, yy and zzsuch that: n=x+y ...
- linux多线程同步的四种方式
1. 在并发情况下,指令执行的先后顺序由内核决定.同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清楚是哪一个先执行.如果运行的结果依赖于多线程执行的顺序,那么就会形成竞争条件,每次运 ...
- Haporxy
安装Haproxy: 下载 wget https://fossies.org/linux/misc/haproxy-1.8.3.tar.gz tar -zxf haproxy-.tar.g cd ha ...
- CSS躬行记(9)——网格布局
网格布局(Grid Layout)也叫栅格布局,与表格布局类似,也依赖行和列.但与之不同的是,网格布局能直接控制HTML文档中元素的顺序.位置和大小等,而不用再借助辅助元素. 一.术语 下图展示了CS ...
- 这是一篇每个人都能读懂的最小生成树文章(Kruskal)
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树. 我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到 ...
- C. Helga Hufflepuff's Cup 树形dp 难
C. Helga Hufflepuff's Cup 这个题目我感觉挺难的,想了好久也写了很久,还是没有写出来. dp[i][j][k] 代表以 i 为根的子树中共选择了 j 个特殊颜色,且当前节点 i ...
- Java UDP小结
UDP: * 发送端 ...
- JS作用域和变量提升看这一篇就够了
作用域是JS中一个很基础但是很重要的概念,面试中也经常出现,本文会详细深入的讲解这个概念及其他相关的概念,包括声明提升,块级作用域,作用域链及作用域链延长等问题. 什么是作用域 第一个问题就是我们要弄 ...
- python 调用ldap同步密码
windows + python2.7 安装 python-ldap https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap 2.python ...
- PAT 1015 Reversible Primes (20分) 谜一般的题目,不就是个进制转换+素数判断
题目 A reversible prime in any number system is a prime whose "reverse" in that number syste ...