C程序sizeof或宏,有问题

时间:2012-11-05 09:57:34

标签: c

  

可能重复:
  A riddle (in C)

有人可以解释这段代码有什么问题吗?

#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};

int main()
{
  int d;

  for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
      printf("%d\n",array[d+1]);

  return 0;
}

2 个答案:

答案 0 :(得分:2)

d <= (TOTAL_ELEMENTS-2)

d已签名:它是int。 但TOTAL_ELEMENTS未签名:sizeof生成size_t值,size_t为无符号类型。

<=表达式d中,通过通常的算术转换将其转换为无符号数,并且它变为一个巨大的数字。

答案 1 :(得分:1)

d为-1且与TOTAL_ELEMENTS-2size_t类型,即无符号整数)进行比较时,d为在无符号类型中提升为大数。然后,d大于TOTAL_ELEMENTS-2,因此循环永远不会执行。

  
    

  
     

§6.5.8关系运营商
  如果两个操作数都具有算术类型,则通常的算术转换是   进行。

     

§6.3.1.8通常的算术转换
  否则,如果具有无符号整数类型的操作数的等级大于或等于   等于另一个操作数的类型的等级,然后是操作数   有符号整数类型转换为带有unsigned的操作数的类型   整数类型。