可能重复:
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;
}
答案 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)
一样使用,而不是为每个数组定义一个宏。然而,这不是你看到问题的原因;你的宏在这里正确使用。这与问题完全正交,它只是一种编码风格的建议。)