#include<stdio.h>
#define TOTAL_NO (sizeof(array) / sizeof(array[0]))
int array[]={23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1; d<=(TOTAL_NO-2); d++)
printf("%d\n",array[d+1]);
return 0;
}
为什么这个程序不显示数组的内容? 错误在哪里?
答案 0 :(得分:2)
TOTAL_NO
返回类型为size_t
的值。这是无符号的,因此d
在循环退出条件下转换为无符号的测试d<=(TOTAL_NO-2)
。
假设32位整数,则进行初始测试
0xffffffff <= 7
这显然会失败,阻止循环运行。
如果将此更改为
,循环将按预期运行for(d=-1; d<=(int)(TOTAL_NO-2); d++)
将循环更改为更正常的形式
for(d=0; d<TOTAL_NO; d++)
也会奏效。这是优选的,因为它可以产生更清晰,更易维护的代码
答案 1 :(得分:1)
使用宏更好
#include<stdio.h>
#define TOTAL_NO(X) (sizeof(X) / sizeof(X[0]))
int array[10]={23,34,12,17,204,99,16};
int main()
{
int d;
for(d = -1; d <= (int)TOTAL_NO(array); d++) {
printf(" %d\n",array[d+1]);
}
return 0;
}
答案 2 :(得分:1)
你应该知道sizeof返回类型size_t,d是int类型,当你把它们放在一起时,d的类型将变为无符号,d将转为大数。如下代码:
int a=-1;
unsigned b=1;
if(b>a)
//something will never run