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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 25.08.2010, 00:18   #1
ts-alan
Форумчанин
 
Регистрация: 07.07.2010
Сообщений: 825
По умолчанию инкремент и for

Различие префиксальной и постфиксальной формы я вродибы знаю,а есть ли различие в употреблений с оператором for.
Если разница между этими выражениями:

for(i=0;i<N;i++); и for(i=0;i<N;++i);
ts-alan вне форума
Старый 25.08.2010, 00:33   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Нет разницы.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 25.08.2010, 00:39   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

В данном случае разницы в работе кода нет, но есть одна маленькая деталь. Поскольку i++ раскрывается как
(t = i, i += 1, t), то здесь у нас возникает локальная копия переменной, которая вообще-то даром никому не нужна, когда можно сразу увеличить нужную переменную. Проблема вроде бы небольшая - памяти жрет мало, да и что может такого произойти, но в особо экзотических случаях, когда вместо типа int используется какой-нибудь пользовательский класс (ну например какой-то очень хитрый итератор), то проблемы с памятью могут быть чуть больше, а уж если у класса будут проблемы с конструктором, тогда вообще весело будет.
Это вот такой взгляд вглубь проблемы, подсмотренный в какой-то книжке Мейерса "Effective что-то там" (Кстати, извиняюсь за оффтоп, но никто не помнит, что за книжка? Когда-то читал на компе, потом потерял, и не смог найти такую же - почему-то находились книжки как будто бы с таким же или похожим названием, но явно не идентичные той, что я раньше читал)
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума
Старый 25.08.2010, 10:52   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

"Наиболее эффективное использование C++" -- у меня такая нашлась, на русском правда, но эта тема в ней есть.
Кстати, есть две книжки с тем же ангельским названием : "More effective C++", но разным содержанием.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума
Старый 25.08.2010, 11:44   #5
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Там, при переиздании русского перевода второй книги, из названия зачем-то выбросили слово "наиболее". В книге 2000г. оно есть, а в 2006г. - уже нет, отсюда и путаница.
Effective C++...;
Перевод;
More Effective C++...;
Перевод.
Vago вне форума
Старый 25.08.2010, 13:51   #6
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

посмотри на дизассемблерный код операци i++ и ++i, вроде разницы не должно быть, оптимизатор следит за этим.
вот
Код:
for (i = 0; i < 10; ++i)
08048d98:   movl $0x0,-0x4(%ebp)
08048d9f:   jmp 0x8048da5 <main+19>
08048da1:   addl $0x1,-0x4(%ebp)
08048da5:   cmpl $0x9,-0x4(%ebp)
08048da9:   setle %al
08048dac:   test %al,%al
08048dae:   jne 0x8048da1 <main+15>
48        	for (i = 0; i < 10; i++)
08048db0:   movl $0x0,-0x4(%ebp)
08048db7:   jmp 0x8048dbd <main+43>
08048db9:   addl $0x1,-0x4(%ebp)
08048dbd:   cmpl $0x9,-0x4(%ebp)
08048dc1:   setle %al
08048dc4:   test %al,%al
08048dc6:   jne 0x8048db9 <main+39>
51        	ii = i++;
08048dc8:   mov -0x4(%ebp),%eax
08048dcb:   mov %eax,-0x8(%ebp)
08048dce:   addl $0x1,-0x4(%ebp)
52        	ii = ++i;
08048dd2:   addl $0x1,-0x4(%ebp)
08048dd6:   mov -0x4(%ebp),%eax
08048dd9:   mov %eax,-0x8(%ebp)
include <Qt>

Последний раз редактировалось sever-42; 25.08.2010 в 14:03.
sever-42 вне форума
Старый 25.08.2010, 13:57   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Если i - объект какого-то класса, то разница будет. Причем не в пользу i++. Если же это char, int или еще какой простой тип, то разницы никакой не будет.
pu4koff вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инкремент для указателя массива структур Valter Общие вопросы C/C++ 6 31.05.2010 18:30
Инкремент константы в цикле, FASM suicide Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 19.12.2009 21:18
использовать оператор цикла, сдвиги и инкремент Еля Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 16.11.2009 15:04
Инкремент и декремент в циклах Nvidia Общие вопросы C/C++ 8 17.10.2009 11:54
Инкремент и дикремент Golovastik Общие вопросы C/C++ 3 16.07.2009 13:39