2013-06-07 2 views
1

Что-то не так с кодом ниже ... Может кто-нибудь объяснить мне, в чем проблема и почему?Что не позволяет напечатать массив в следующем коде?

#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

'TOTAL_ELEMENTS' без знака (например, без знака долго долго),' D <= (TOTAL_ELEMENTS-2) 'сравнивается как без знака. – BLUEPIXY

ответ

1

SizeOf Оператор: ...

«Значение из результатом является реализация-de Нед и его тип (целое число без знака типа) является size_t, де определено в < stddef.h> (и другие заголовки) «. - стандарт C99.

Конверсии: ...

«В противном случае, если операнд, который имеет беззнаковое целое число типа имеет ранг больше или равен рангу типа другого операнда, то операнд с подписью целочисленного типа преобразуется в тип операнда с целым типом без знака. " - стандарт C99.

int d (-1) преобразуется в тип (TOTAL_ELEMENTS-2), который является sizeof возвращаемым типом (целое число без знака). Обычно это делается путем переинтерпретации битов как unsigned value => -1 signed integer = 0xFFFFFFFF (если int имеет 32 бита) беззнаковое целое число.

Вы пытаетесь сравнить 0xFFFFFFFF с 0x5 (TOTAL_ELEMENTS-2), который является ложным.

Вы должны иметь предупреждение ... подписан/без знака несоответствие ...

C99 standard

3

Обычные арифметические преобразования.

В выражении <= значение -1int преобразуются в беззнаковый тип sizeof и становится огромным значением и выражение <= затем ложно.

Использование:

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

Пожалуйста, найдите ниже изменения

#include

#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
int array[] = {23,34,12,17,204,99,16}; 

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

    return 0; 
} 
Смежные вопросы