2017-01-18 11 views
1

Ниже приведен код, с которым у меня возникают проблемы. Я понимаю константы и считаю, что понимаю функцию sizeof, но, должно быть, чего-то не хватает. Вот то, что я пытался сделать, чтобы решить в одиночку: - printf заявление с TOTAL_ELEMENTS как %d - она ​​возвращает 7 - printf заявление TOTAL_ELEMENTS - 2 - она ​​возвращает 5 (как и ожидалось) - заменить 5 в течение loop loop работает правильно - инициализирует глобальную переменную int любого имени и устанавливает ее равной (sizeof(array)/sizeof(array[0])). Затем используйте переменную в цикле for, где будут идти TOTAL_ELEMENTS - снова цикл работает правильно.C Программа - о размере и константе, используемой вместе

Так что (по крайней мере, в моей голове), это должно быть что-то, что связано как с константой, так и с функцией sizeof. Я уверен, что массив/массив [0] также играет роль, но через тестирование и замену я могу " t выяснить, в чем проблема. Я прочитал функцию sizeof, а также константы безрезультатно. Я пробовал искать, но не получил, где я не совсем уверен, что я ищу. Мне не нужны ответы, но если кто-то может указать мне в правильном направлении, это будет очень признательно. Заранее спасибо.

#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

Возможно, это компилятор, который я использую; он должен отображать все элементы массива, но все, что происходит, когда я пытаюсь запустить его, выполняется и заканчивается без вывода на печать. – ManofManyTigers

+0

хорошо; Я скопировал код в ideone.com в компилятор/исполнитель C, и он тоже выходит без вывода. Однако, когда я меняю код, указанный в первоначальном описании, он работает так, как ожидалось; все еще не уверены. – ManofManyTigers

+0

Я получаю тот же результат ... Нет вывода. Единственный способ получить ожидаемый результат - назначить 'int dmax = (TOTAL_ELEMENTS-2);' и изменить цикл на 'for (d = -1; d <= dmax; d ++)'. –

ответ

1

Эта проблема не связана с sizeof. это из-за сравнения, подписанного с неподписанным значением. В вашем коде (TOTAL_ELEMENTS-2) имеет значение без знака, но d - это подписанная переменная. поэтому for условие будет сравнивать 5 с 0xFFFFFFFF и 5 меньше, чем 0xFFFFFFFF, тогда оно всегда ложно! Например:

int main() 
{ 
    int d; 
    unsigned int e = 5; 
    for (d = -1; d <= e; d++) 
     printf("%d\n", array[d + 1]); 

    return 0; 
} 

Это не печатают какие-то вещи! , то же, что и ваш код.

+0

Вы можете принудительно выполнить сопоставленное сопоставление путем литья в 'int' в цикле' for (d = -1; d <= (int) (TOTAL_ELEMENTS-2); d ++) '. –

+0

Спасибо всем! Это была большая помощь. – ManofManyTigers