2017-02-18 8 views
0

следующий код печатает ничего:2 подобные программы C с макро не производить различные выходные

#include<stdio.h> 
#define TOTAL_SIZE ((sizeof(array))/(sizeof(array[0]))) 
int main() 
{ 
    int array[]={1,2,3}, d; 
    for(d=-1; d<=TOTAL_SIZE-2; ++d) 
    { 
     printf("%d\n", array[d+1]); 
    } 
    return 0; 
} 

д = -1 < = 3-2
печатает массив [-1 + 1], который является массивом [0]
д = 0 < = 3-2
печатает массив [0 + 1], который является массивом [1]
д = 1 < = 3-2
печатает массив [1 + 1], который является массивом [2]

Но ни один элемент не напечатан!



Но этот код производит правильный вывод печать всех элементов в массиве:

#include<stdio.h> 
#define TOTAL_SIZE ((sizeof(array))/(sizeof(array[0]))) 
int main() 
{ 
    int array[]={1,2,3}, d; 
    for(d=0; d<=TOTAL_SIZE-1; ++d) 
    { 
     printf("%d\n", array[d]); 
    } 
    return 0; 
} 

Но чистый эффект обеих петель кажутся одинаковыми.

Если мы заменим макрос TOTAL_SIZE на количество элементов в массиве, оно будет работать. Таким образом, проблема связана с макросом.

Но когда я пытаюсь распечатать значение, генерируемое TOTAL_SIZE, оно печатает правильное значение.

В чем проблема с первой программой?

+4

Включите все предупреждения и обработайте их как ошибки. Это единственный способ оставаться в здравом уме. Для gcc и clang это '-Wall -Wextra -Wpedantic -Werror'. –

ответ

8

Проблема с макросом является то, что sizeof возвращает size_t, который является без знака целого типа, что вы сравниваете к подписалint. Решение состоит в том, чтобы наложить ваш размер на int.

#define TOTAL_SIZE (int)((sizeof(array))/(sizeof(array[0])))

+2

Nitpick, он возвращает 'size_t', который представляет собой целочисленный тип без указания цепочки, но не обязательно ** тип **' unsigned int'. – StoryTeller

+0

да, но размер_t is * неподписанный *. спасибо за исправление :) – Micha

+0

Итак, моя проблема заключалась в сравнении начального значения d (которое является знаковым числом, т.е. -1), с size_t, возвращаемым sizeof. Спасибо за помощь. –