先看下面一段程序,这段程序摘自《C 专家编程》:
01#include <stdio.h>
02int array[] = {23,34,12,17,204,99,16};
03#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
04
05int main(void)
06{
07 int d=-1,x;
08 /*........*/
09
10 if(d <= TOTALTOTAL_ELEMENTS - 2)
11 x = array[d+1];
12 /*........*/
13 return 0;
14}
赋值语句x=array[d+1];根本不会执行。原因在于sizeof求算类型大小时的返回值是unsigned int类型,而d是signed int类型。if语句测试两者大小,d会自动提升类型变为unsigned int。-1转换为unsigned int是一个很大的正整数。所以表达式的值永远为假,因此后面的赋值语句永远不会执行。这是C语言中隐式类型转换的一个规则。
计算数组size 的一个小技巧: #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))