2014-01-06 3 views
2
#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; 

} 

Почему эта программа не отображает содержимое массива? Где ошибка?Я не получаю желаемого выхода для этой программы на C

+0

Почему бы не 'для (г = 0, г Kninnug

+1

sizeof (int) возвращает unsingned int. или size_t, которая содержит uint32_t. – tesseract

ответ

2

TOTAL_NO возвращает значение с типом size_t. Он не имеет знака, поэтому d преобразуется в unsigned для теста d<=(TOTAL_NO-2) в состояние выхода из цикла.

Предполагая, что 32-битные числа, это делает первоначальное испытание

0xffffffff <= 7 

Это, очевидно, выходит из строя, предотвращая петлю от запуска.

Цикл работает, как вы ожидаете, если вы измените это

for(d=-1; d<=(int)(TOTAL_NO-2); d++) 

Изменение цикла к более нормальной форме

for(d=0; d<TOTAL_NO; d++) 

будет работать тоже. Это является предпочтительным, поскольку это приводит к более ясным и поддерживаемому коду

+0

да теперь его рабочий тон, я забыл, что sizeof производит целое число без знака. Благодарю. – user2728397

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; 

} 
1

вы должны знать, SizeOf тип возвращает size_t, и d имеет тип INT, когда вы поместите их вместе, тип д станут для знака, и д превратится в большой number.like ниже код:

int a=-1; 
unsigned b=1; 
if(b>a) 
    //something will never run 
Смежные вопросы