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

c

2636 просмотра

4 ответа

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

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

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

Автор: Gilad Naaman Источник Размещён: 12.11.2019 09:23

Ответы (4)


35 плюса

Решение

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

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

Автор: interjay Размещён: 10.04.2011 12:38

8 плюса

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

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

Автор: Blagovest Buyukliev Размещён: 10.04.2011 12:44

3 плюса

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

#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 возвращает беззнаковый тип данных , но он сравнивается с подписанным типом данных (- это ошибка)

Автор: SridharKritha Размещён: 27.07.2013 09:39

0 плюса

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

#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 неявно преобразуется в unsigned, который равен 0xffffffff и, очевидно, больше, чем sizeof (int). Также посмотрите на пример несовместимого кода (Сравнение)

Автор: Deepak Uniyal Размещён: 06.01.2015 07:19
Вопросы из категории :
32x32