c++ 默认类型的转换

对于C/C++语言来说,在通常情况下语句和表达式的操作通常只使用一种类型的变量和常量。但在实际的开发中,往往会有不同类型的变量之间进行运算,为了满足这样的代码需求,通常在编译器中会设置不同类型自动类型转换,以完成相应的运算。但是如果我们对这样的自动类型转换不熟悉,往往会写出错误的代码,令人摸不清头脑,这种错误往往也是严重的。

//测试代码一:
#include<stdio.h>

int main(){
    unsigned int a = 1;
    char b = -1;
    return a>b?'a':'b';
    return 0;
}

对于上边的代码,表观看上去变量a1,变量b-1。所以上述代码的执行结果为a,但实际上执行结果却是b,如下图。
这里写图片描述
为什么会出现这种情况?-1难道比1大吗?

实际上当不同类型的变量做运算时,编译器为了提高计算的精度,会进行数据的类型自动转换,按照下图的方式进行转换。
这里写图片描述
自动数据类型转换的规则:

1.横向红色的箭头表示的是无条件转换,float类型数据运算时,将其转换为double类型进行运算,运算结果再转换为float;short和char类型数据在做运算时,首先转换为int,再将运算结果转换为short、char类型。
2.纵向的蓝色箭头,当不同数据类型之间进行运算时,位于箭头下方的数据类型会转换为箭头上方的数据类型。

借助上述的规则,分析一下上述代码的执行结果为什么是b。

#include<stdio.h>
int main(){
    unsigned int a = 1;//0x00000001
    char b = -1;//会自动转换为int类型
    return a>b?'a':'b';
    //a > b,unsigned int和int进行比较时,int会转换为unsigned int
    //unsigned int b = -1;//十六进制表达为  0xffffffff
    return 0;
}

因此,输出为b。

//测试代码二:
#include<iostream>
using namespace std;

bool compare(int a,int b){
    cout<<"compare(int,int)"<<endl;
    return a>b;
}

bool compare(float a,float b){
    cout<<"compare(float,float)"<<endl;
    return a>b;
}

int main(){
    compare(10,20);
    compare(10.1,20.2); 
    return 0;
}

显然,上述的代码是编译不通过的。
这里写图片描述
函数重载会进行类型推演,但是对于compare(10.1,20.2)参数首先会自动转换为double类型,但是进行重载时,如上图类型转换图中没有一个规定对于double的数据到底转换为int还是float,出现了二义性因此会出现编译错误。
这里写图片描述
以上两个例子比较鲜明,对于这样编译器这样的自动类型转换,程序员需要熟稔于心,才不会写出错误的代码。

猜你喜欢

转载自blog.csdn.net/ASJBFJSB/article/details/81349244
今日推荐