• C++ 隐式类型转换


    C++定义了一组内置类型对象之间的转换标准,在必要的时候它们被编译器隐式的转换

    1、任何两种或多种类型的数据和变量混合操作的时候,最宽的数据类型成为目标转换类型(常量和变量都会被改变)

    2、不同类型的表达式之间赋值的时候,被赋值的对象类型成为目标转换类型

    3、函数调用实参和形参类型不一致的时候,形参的对象类型成为目标转换类型

    4、函数的返回值类型和函数表达式的类型不一样的时候,函数表达式的类型成为目标转换类型

    注意:算术运算中两个通用的的指导准则如下

    (1)为了防止精度损失,类型总是被提升为较宽的类型。

    (2)所有含有小于整型的有序类型的算术表达式在计算之前其类型都会被转换成整型(即整数提升),计算完之后再转换为被定义的类型。

    按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和 short 并没有出现于这个等级列表,是因为它们应该已经被升级成了 int 或者 unsigned int。

     例如:

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int a[]={1,2,2,3,4};
     6     int n=sizeof(a);
     7     if(-1>(n/sizeof(int)))
     8         cout<<"1";
     9     else
    10         cout<<"2";
    11     return 0;
    12 }

    上述代码的输出结果竟然是1,原因在于sizeof()的返回类型是unsigned int,而-1是int,所以-1被隐式的转换成了unsigned int类型,而变成了

    oxffffffff,当然就比5大了。

    第一段代码相当于这样

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int a[]={1,2,2,3,4};
     6     int n=sizeof(a);
     7     unsinged int b=n/sizeof(int);
     8     if(-1>b)
     9     //if(-1>(n/sizeof(int)))
    10         cout<<"1";
    11     else
    12         cout<<"2";
    13     return 0;
    14 }

    如果把这段代码中第7行改为 int b=n/sizeof(int)的话,就会输出2了

    这也告诉我们在写程序的时候要尽量避免多种类型的混合操作。

  • 相关阅读:
    在WCF中使用websocket
    KISSY
    微信小程序开发参考资料汇总
    PhpStorm最新版 2017激活办法
    为什么我要用 Node.js? 案例逐一介绍
    产品的三种流程图,你都知道吗?
    数据挖掘工具分析北京房价 (一) 数据爬取采集(转)
    使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)
    服务端指南 数据存储篇 | 聊聊 Redis 使用场景(转)
    wxBot微信机器人框架(转)
  • 原文地址:https://www.cnblogs.com/bewolf/p/4358006.html
Copyright © 2020-2023  润新知