2015-09-08 2 views
1

Я пытаюсь выполнить следующий фрагмент кода, который должен печатать содержимое глобального массива. Но почему цикл for никогда не вводится?Печать содержимого глобального массива с использованием цикла не производит вывод

#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; 
} 
+1

Почему так сложно? is 'for (d = 0; d Olaf

+0

Как вы знаете, что это не выполнено? Что говорит отладчик? Код запутан, но выглядит нормально. – Olaf

+2

Я думаю: d повышается до unsigned int из-за определения unsigned. Тогда -1 стал MAX без знака int – LPs

ответ

3

d повышен до unsigned int из-за #define из TOTAL_ELEMENTS является unsigned. Таким образом, значение -1 становится максимальным значением unsigned int.

Изменить код ниже

#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 <= (int)(TOTAL_ELEMENTS - 2); d++) 
     printf("%d\n", array[d + 1]); 

    return 0; 
} 
+0

В 64-битной дуге он, скорее всего, принужден к 'unsigned long', потому что' size_t' (возвращается 'sizeof'), скорее всего, 64 бит. – Olaf

1

Честно говоря, я был немного удивлен, что ты прав ;-) Это, кажется, что ваш цикл разбирает ваш макрос беззнаковое значение, что делает он не может правильно сравнивать с отрицательным целым числом. Заменить справку на

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

и ваш код работает.

Смежные вопросы