类型转换

先看下面一段程序,这段程序摘自《C专家编程》:

如果是有这样一段程序的话,你永远无法知道x的值到底是多少,因为这句赋值语句x=array[d+1];根本不会执行。原因在哪?经过调试发现程序执行到if语句进行判断完之后,直接跳过下面一条语句的执行。下面来分析一下原因,因为sizeof求算类型大小时的返回值是unsignedint类型,而d是signed int,if语句测试两者大小,d会自动升级为unsignedint,-1转换为unsigned int是一个很大的正整数,所以表达式的值永远为假,因此后面的赋值语句永远不会执行。这里面就是类型转换带来的bug,如果稍不注意,则可能对整个工程或者项目造成无法预测的后果,而这个bug是很难直接调试能够调试得出来的。

 

int array[] = {1, 2, 4, 5, 6};

char str[] = “hello!”;

性质一样,数组名不能改变大小,sizeof计算的是数组的字节数;

char *str1 = “hello!”;

char *str2 = str;

int *array1 = array;

性质一样,都是指针,可以改变大小,sizeof计算的结果是4字节。

 

测试代码:

#include<stdio.h>
int main(void)
{
int array[]={1,2,4,5,6};
char str[]="hello!";
int a=sizeof(array);
int b=sizeof(str);
printf("%d\n",a);
printf("%d\n",b);

char *str1="hello!";
char *str2=str1;
int *array1=array;
int c=sizeof(str2);printf("%d\n",c);printf("%s\n",str2);
int d=sizeof(array1);printf("%d\n",d);printf("%s\n",array1);
}