为什么我的C程序不打印数组值?

时间:2011-07-04 03:42:44

标签: 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;
 }

1 个答案:

答案 0 :(得分:7)

问题是,TOTAL_ELEMENTS是一个无符号值,在您尝试此操作的实现上,它可能是unsigned long int。比较将尝试将d-1的整数值提升为unsigned long,这将导致类似0xFFFFFFFFFFFFFFFF并且大于7-2 = 5(结果为TOTAL_ELEMENTS-2);因此,循环条件被评估为false并且从不执​​行正文。如果您明确地从比较运算符的右侧抛弃unsigned,它应该可以正常工作:

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

(顺便说一下,COUNTOF宏通常定义为:

#define COUNTOF(x) ((sizeof((x))/sizeof(*(x)))

并像COUNTOF(array)一样使用,而不是为每个数组定义一个宏。然而,这不是你看到问题的原因;你的宏在这里正确使用。这与问题完全正交,它只是一种编码风格的建议。)