• 【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 = 10;
        int b = 3;
        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 0;
    }

    运行结果如图:

    (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].北京:清华大学出版社.

  • 相关阅读:
    linux使用shell执行一个Python文件
    shell编程
    mysql之通过cmd连接远程数据库
    单词辨析
    安全测试
    Linux下使用crontab执行一个shell脚本
    重新梳理Linux系统中Python环境的问题
    selenium 定位元素不稳定怎么解决?
    爬虫数据分析的前景
    Linux下部署python selenium UI自动化测试
  • 原文地址:https://www.cnblogs.com/chen-hw/p/11640664.html
Copyright © 2020-2023  润新知