类型提升问题

来源:互联网 发布:java优先级队列 编辑:程序博客网 时间:2024/05/18 02:28
int main(){int array[] = { 23, 34, 45, 56, 67, 78 };unsigned int key = sizeof(array) / sizeof(array[0]);int d = -1;intx = 3;if (d <= key  - 2)x = array[d + 1];printf("the value of x is %d\n", x);system("pause");return 0;}

让这段代码运行一下,思考一下结果 一般而言我们会认为输出结果会是多少?23?

那看一下输出结果:


结果是3,部分同学可能会惊讶 d 很明显小于 key-2, 应该执行接下来的赋值语句

这里呢,就涉及到C语言中的类型提升问题,C语言中类型提升主要分为整形提升和浮点类型提升

整形提升:如果运算的操作数是同一类型则不进行类型提升,如果操作数之间的类型不一致且都为整型,当操作数都为无符号整型

者都为无符号整型时,较短的操作数将转换为较长的操作数再进行运算(即sizeof的值较小的向sizeof较大的转换),当操作数中即

有有符号整型又有无符号整型时,若有符号整型的操作数的长度小于等于无符号整型的操作数那么其将转换为无符号整型的操作

数,若有符号整型的操作数的长度大于无符号整型的操作数,那么有符号整型转换为无符号整型参与运算后的结果再转换为有符号

整型


浮点类型提升:当操作数中最长的一个类型为long double类型则,其他操作数类型提升至long double类型再进行运算,当最长类

型为double则其他操作数提升至double类型,当最长类型为float则其他操作数提升至float类型,在这个过程中整型操作数全部转换

为对应操作数的浮点类型,浮点数进行运算时的结果可能会用范围与精度更大的浮点类型表示


现在看上面的例题

因为key的类型为unsigned int 所以在if判断中发生类型提升d有int提升至unsigned int,则d此时的值大于零不符合if条件,所以不执

行接下来的赋值语句。因此x值未发生变化。


类型提升有点类似于不同数据类型的转换,当两个数据之间类型不同时,若直接进行比较或赋值运算时会自动先将两个不同类型的

数据均转化为其中的某种类型再进行操作,因此发生了类型提升。导致一些意外性让人茫然的错误。