Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2010, 09:58   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
Стрелка двойной вывод элементов массива

Здравствуйте. Имеется массив, в котором данные идут друг за другом:
Код:
int num[]={1,2,3,4,5,6,7,8,9,10,0}
выводя их на экран таким образом:
Код:
while(num[n]){printf("%d", num[n++]);}
На экране будет 1234567910, иными словами, все в порядке.

Но если я буду выводить по 2 элемента за раз:
Код:
while(num[n]){printf("%d - %d\n", num[n++], num[n++]);}
то почему-то они отображаются в ином порядке:
2 - 1
4 - 3
6 - 5
8 - 7
10 - 9

я догадываюсь, что проблема именно в инкрименте "n++", который стоит в качестве элемента массива, и причем дважды, но тем неменее, интересно понять, почему именно так? Ведь кажется все правильно, вывод, сдвиг вперед, вывод, сдвиг вперед.
Артэс вне форума Ответить с цитированием
Старый 07.07.2010, 10:43   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Сходите сюда
(cout - аналог printf из C++)
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 07.07.2010, 10:47   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Чтобы избежать недоразумений, нужно избегать нескольких инкрементов/декрементов одной переменной в одной строке
Код:
while(num[n])
{
  printf("%d - %d\n", num[n], num[n+1]);
  n += 2;
}
pu4koff вне форума Ответить с цитированием
Старый 07.07.2010, 11:31   #4
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Спасибо. Да, я думал о таком способе, но хотелось упростить код как можно лучше, без лишних обращений к переменным, что бы функция работала быстрее...

Ладно, и еще вопрос по теме. Скажите, а чтение элементов массива не через номер элемента:
Код:
while(num[n]){...num[n++];}
а через адрес в памяти, типа:
Код:
char num[]=......; // сам массив
char *a=num;

while(*a){...*a++;} //обращение к данным, и сразу сдвиг вперед (в цикле)
будет осуществляться быстрее?

Последний раз редактировалось Артэс; 07.07.2010 в 11:34.
Артэс вне форума Ответить с цитированием
Старый 07.07.2010, 11:40   #5
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

В теории дя, особенно в многомерных массивах, НО эта быстрота столь незначительна, что на неё можно плюнуть, если в массиве три элемента, а функция вызывается четыре раза за время выполнения программы
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 07.07.2010, 11:42   #6
Loji
Новичок
Джуниор
 
Регистрация: 04.07.2010
Сообщений: 38
По умолчанию

Цитата:
Сообщение от Артэс Посмотреть сообщение
Здравствуйте. Имеется массив, в котором данные идут друг за другом:
Код:
int num[]={1,2,3,4,5,6,7,8,9,10,0}
выводя их на экран таким образом:
Сделай так :

Код:
while(num[n]){printf("%d - %d\n", num[n++], num[++n]);

Последний раз редактировалось Loji; 07.07.2010 в 11:45.
Loji вне форума Ответить с цитированием
Старый 07.07.2010, 11:45   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

интерестно а почему быстрее?
по сути же одно и тоже, что через указатель, что через индекс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.07.2010, 11:48   #8
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
интерестно а почему быстрее?
по сути же одно и тоже, что через указатель, что через индекс.
Операция индекса будет обращаться к таковой в определении класса, в то время как указатель будет достовавть элемент напрямую - выигрыш 0,0000001 сек.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 07.07.2010, 12:00   #9
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

array[ i ] разворачивается в *( (void*)array + i * sizeof( *array ) ), если всё правильно помню
*array разворачивается в *array

Но опять же, выигрыш есть в многомерных массивах, и да, если он не нужен( а он очень мал ), то нужно пользоваться индексом.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux

Последний раз редактировалось ozo; 07.07.2010 в 12:06.
ozo вне форума Ответить с цитированием
Старый 07.07.2010, 12:02   #10
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Loji Посмотреть сообщение
Сделай так :

Код:
while(num[n]){printf("%d - %d\n", num[n++], num[++n]);
А чему равно i+++++i ? Опять же - один фиг, стандартом не определен порядок вычисления этого всего, а следовательно в разных компиляторах будет разный ответ.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод элементов массива.Изменение элементов массива. Vesnushka18 Помощь студентам 6 09.06.2011 13:05
вывод элементов из массива kirosin PHP 3 15.05.2010 13:00
вывод элементов массива. PASCAL. lammy Помощь студентам 4 01.04.2010 21:45
Вывод значения элементов массива valdemar593 Общие вопросы C/C++ 7 22.12.2009 21:37
Вывод ненулевых элементов массива Ci_novice Общие вопросы C/C++ 2 28.12.2007 14:59