Загадка (в т. Ч.)
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
подписано, поэтому проблем нет.
8 плюса
sizeof
Оператор дает результат типа size_t
. В первой версии вы сравниваете int
(подписано) с size_t
(без знака).
Во второй версии вы преобразуете size_t
выражение в a int
, присваивая его, и, следовательно, оба операнда сравнения имеют одинаковый тип.
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:390 плюса
Я запускаю следующую программу без использования макросов, и на выходе ничего не было
#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Вопросы из категории :
- c Как вы форматируете unsigned long long int, используя printf?
- c What are the barriers to understanding pointers and what can be done to overcome them?
- c Как реализовать продолжения?
- c Как вы передаете функцию в качестве параметра в C?
- c Как получить список каталогов в C?
- c В чем разница между #include <filename> и #include "filename"?
- c Всегда ли выгодно использовать «goto» в языке, который поддерживает циклы и функции? Если так, то почему?
- c В чем разница между ++ i и i ++?
- c Есть ли разница в производительности между i ++ и ++ i в C?
- c Какой самый лучший бесплатный детектор утечки памяти для программы на C / C ++ и ее подключаемых библиотек DLL?
- c Как разделить два 64-битных числа в ядре Linux?
- c Как определить размер моего массива в C?
- c Как я могу запустить внешнюю программу из C и проанализировать ее вывод?
- c Как вы обнаруживаете / избегаете утечки памяти в вашем (неуправляемом) коде?
- c Как вы устанавливаете, очищаете и переключаете один бит?
- c Преобразование без знака в C - всегда ли это безопасно?
- c Что делает оператор запятой?
- c Как начать потоки в plain C?
- c How to determine CPU and memory consumption from inside a process?
- c Что такое неподписанный символ?