Печать элементов массива
18418 просмотра
6 ответа
Ожидаемый результат следующей C-программы - распечатать элементы массива. Но когда на самом деле работает, это не так.
#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;
}
Какова причина ?
Автор: josh Источник Размещён: 12.11.2019 09:40Ответы (6)
5 плюса
Когда вы делаете сравнение d <= (TOTAL_ELEMENTS-2)
, выполняется преобразование типа . d
имеет тип signed int
while, (TOTAL_ELEMENTS-2)
имеет тип size_t
, который является беззнаковым типом. Правила C говорят, что когда оператор имеет подписанный и неподписанный аргумент, а неподписанный аргумент имеет больший или равный размер со подписанным аргументом, тогда подписанный аргумент преобразуется в неподписанный.
То есть сравнение заканчивается так:
(size_t) d <= (TOTAL_ELEMENTS-2)
И потому что size_t
без знака, (size_t) -1
это действительно, очень большое число, а не -1 больше. Для 32-битной версии size_t
это будет 2 32 - 1 = 4 294 967 295.
Чтобы исправить это, вы можете явно привести правую часть к подписанному int:
d <= (int) (TOTAL_ELEMENTS-2)
Или, лучше, просто избавиться от странной негативной индексации и тому подобного.
Для дальнейшего использования включите все возможные предупреждения компилятора . Например, gcc напечатает предупреждение, если вы включите -Wall -Wextra
:
$ gcc -o arrayprint -Wall -Wextra -ansi arrayprint.c
arrayprint.c: In function ‘main’:
arrayprint.c:11: warning: comparison between signed and unsigned
Автор: John Kugelman supports Monica
Размещён: 01.08.2010 06:10
6 плюса
TOTAL_ELEMENTS
без знака. -1, при преобразовании в unsigned, является действительно огромным числом, которое не меньше 6. Таким образом, ваш цикл никогда не запускается.
3 плюса
Сначала я не знал. Но когда я скомпилировал его с помощью GCC, это было очевидно:
$ gcc -Wall -Wextra -Os a.c
a.c: In function `main':
a.c:11: warning: comparison between signed and unsigned
Итак, у вас есть сравнение следующим образом:
(int) -1 <= (size_t) 5
Поскольку один из типов подписан, а другой - без знака, сначала их необходимо преобразовать в общий тип. В этом случае это так size_t
. Это делает это:
(size_t) -1 <= (size_t) 5
Теперь -1
не может быть представлен без знака. Следовательно, size_t
к нему добавляется 2 ^ 32 (или сколько бы битов ), что делает его 4294967295. Таким образом, сравнение действительно таково:
4294967295 <= 5
И это false
, следовательно, тело цикла никогда не выполняется.
1 плюс
Причина в том, что цикл никогда не выполняется. Это потому, что TOTAL_ELEMENTS
возвращает size_t, тип без знака.
Вы можете исправить это, приведя (TOTAL_ELEMENTS-2)
к int.
0 плюса
Вам необходимо сделать следующее:
for(d=0;d < TOTAL_ELEMENTS;d++)
printf("%d\n",array[d]);
as sizeof(...)
выдает значение без знака.
0 плюса
Просто поменяй
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
С участием
#define TOTAL_ELEMENTS (int)(sizeof(array)/sizeof(array[0]))-2
Автор: Cristy
Размещён: 01.08.2010 06:30
Вопросы из категории :
- 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?
- arrays Как удалить дубликаты из массива C #?
- arrays Как определить размер моего массива в C?
- arrays Каков наилучший способ конвертировать массив в хеш в Ruby
- arrays Сравнение двухбайтовых массивов в .NET
- arrays Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- arrays Haxe итерация на динамическом
- arrays .Net массивы с нижней границей> 0
- arrays Слияние двух массивов в .NET
- arrays Как удалить объекты из массива в Java?
- arrays ArrayList в Java и ввод