c语言自动类型转换

先看一段程序,很经典
 1 #include <stdio.h>
2 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
3 int array[] = {23,34,12,17,204,99,16};
4 int main()
5 {
6 int d;
7
8 for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
9 printf("%d\n",array[d+1]);
10
11 return 0;
12 }
运行上面的程序,结果是什么都没有输出,导致这个结果的原因是sizeof的返回值是一个unsinged int,为此在比较int d 和TOTAL_ELEMENTS两个值都被转换成了unsigned int来进行比较,这样就导致-1被转换成一个非常大的值,以至于for循环不满足条件。因此,如果程序员不能理解sizeof操作符返回的是一个unsigned int的话,就会产生类似如上的人机歧义。
 
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数
其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为
 
  typedef unsigned int size_t;
 
sizeof有三种语法形式,如下:
 
  1) sizeof( object ); // sizeof( 对象 );
 
  2) sizeof( type_name ); // sizeof( 类型 );
 
  3) sizeof object; // sizeof 对象;
 

自动转换遵循以下规则:

1)        若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

2)        转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

     a.若两种类型的字节数不同,转换成字节数高的类型

     b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

3)        所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

4)        char型和short型参与运算时,必须先转换成int型。

5)        在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失     的部分按四舍五入向前舍入。

 

posted on 2012-02-23 17:30  一指流砂  阅读(590)  评论(0编辑  收藏  举报

导航