我没有得到这个C程序的期望输出

时间:2014-01-06 14:45:27

标签: c arrays c-preprocessor

#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;

}

为什么这个程序不显示数组的内容? 错误在哪里?

3 个答案:

答案 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