Загадка (в т. Ч.) - PullRequest
       22

Загадка (в т. Ч.)

16 голосов
/ 10 апреля 2011

Друг дал мне загадку:

#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]);
      getchar();
      return 0;
  }

Приведенный выше код должен печатать все элементы массива, в чем проблема в коде (на выходе ничего нет)? Я думаю, что цикл не повторяется ни разу?

Я обнаружил, что следующий код работает :

#include<stdio.h>



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

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

У меня есть теория, что это как-то связано с макросом, но я не могу разобраться в проблеме.

Ответы [ 4 ]

35 голосов
/ 10 апреля 2011

Проблема в том, что (TOTAL_ELEMENTS-2) является значением без знака. При выполнении сравнения d <= (TOTAL_ELEMENTS-2) оба значения преобразуются в значения без знака, и в результате получается значение false.

Во втором примере x подписано, поэтому проблем нет.

8 голосов
/ 10 апреля 2011

Оператор sizeof возвращает результат типа size_t.В первой версии вы сравниваете int (со знаком) с size_t (без знака).

Во второй версии вы конвертируете выражение size_t в int, присваивая егои, следовательно, оба операнда сравнения имеют один и тот же тип.

3 голосов
/ 28 июля 2013

Еще один способ увидеть эту проблему следующим образом

#include<stdio.h>

int main() {

int i = -5;
unsigned int j = 6;

if(i < j)
  printf("-5 is less than 6");
else
  printf("-5 is greater than 6");

return 0;
}

Вывод:

-5 is greater than 6

Причина: Сравнение целого числа без знака с целым числом со знаком всегда возвращает false.

В случае спрашивающего sizeof возвращает беззнаковый тип данных, но он сравнивается с подписанным типом данных (- ошибка)

0 голосов
/ 06 января 2015

Я запустил следующую программу без использования макроса, и на выходе ничего не было

#include<stdio.h>
int main()
{
  int d;
for(d=-1;d<=sizeof(int);d++)
{  
 printf("sizeof operator\n");
}
return 0;
}

Так что это означает, что проблема не в MACRO , а в типе значения sizeof.sizeof возвращает размер типа данных как size_t, который без знака , но -1 неявно преобразуется в без знака, который равен 0xffffffff и, очевидно, больше, чем sizeof (int).Также посмотрите на Пример несовместимого кода (Сравнение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...