• 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了

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

  • 相关阅读:
    WPF数据爬取小工具-某宝推广位批量生成,及订单爬取 记:接单最痛一次的感悟
    .net core2.1
    Ng Alain使用
    MediatR
    RN错误随笔
    【转载】DDD分层架构的三种模式
    1.RN环境搭建,创建项目,使用夜神模拟调试
    ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
    ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作
    vue的父子通信
  • 原文地址:https://www.cnblogs.com/bewolf/p/4358006.html
Copyright © 2020-2023  润新知