Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/37: Рейтинг темы: голосов - 37, средняя оценка - 5.00
 Аватар для Saiberg
20 / 20 / 2
Регистрация: 23.09.2010
Сообщений: 193

i++ vs ++i (циклы)

11.06.2011, 15:05. Показов 7963. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собстно стало интересно почему все пишут
C++
1
2
3
for(ptrdiff i = 0; i < 10; i++) {
 
}
постфиксный инкремент медленнее, а в данном случае в нем смысла я не вижу. для красоты что ли?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2011, 15:05
Ответы с готовыми решениями:

Заменить в коде циклы for на циклы while
int i, j, n; bool a; cin &gt;&gt; i &gt;&gt; n; for (i; i&lt;n; i++) { a = true; for (j = 2; j &lt;= i / 2; j++) if ((i%j) == 0) a =...

Циклы с условием, циклы с переменной, вложенные циклы
С условием 1. Ввести натуральное число N и вычислить сумму всех чисел фибоначчи меньших N. Предусмотреть защиту от ввода...

Циклы. Напечатать числа в виде таблицы, используя только циклы
Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): 1 2 2 ...

46
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.06.2011, 15:09
Цитата Сообщение от Saiberg Посмотреть сообщение
постфиксный инкремент медленнее
???
По идее разницы в бинарном коде быть не должно, так что для красоты.
Лично я пишу постфиксный из-за билдера, там если поставить for и пробел, то автоматически вставляется цикл с постфиксным инкрементом... =)
1
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
11.06.2011, 15:12
Лучший ответ Сообщение было отмечено как решение

Решение

Для _не_ встроеных типов принципиально писать префиксный, так как постфиксная запись предполагает создание временного объекта.
5
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.06.2011, 17:41
Цитата Сообщение от Saiberg Посмотреть сообщение
постфиксный инкремент медленнее
чушь, для стандартных типов нет разницы в скорости
1
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 17:46
Maxwe11, есть, просто компиляторы обычно оптимизируют код по их желанию, в таких случаях как for , поэтому разницы и не видно становится
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.06.2011, 18:03
OstapBender, в ассемблерных командах нет разницы(в скорости) между постфиксом и префиксом и это не зависит от компилятора
Code
1
2
3
4
5
6
7
8
9
10
11
int i = 0, j = 0;
00ED139E  mov         dword ptr [i],0  
00ED13A5  mov         dword ptr [j],0  
     7:     i++;
00ED13AC  mov         eax,dword ptr [i]  
00ED13AF  add         eax,1  
00ED13B2  mov         dword ptr [i],eax  
     8:     ++j;
00ED13B5  mov         eax,dword ptr [j]  
00ED13B8  add         eax,1  
00ED13BB  mov         dword ptr [j],eax
2
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 18:07
Maxwe11,
C
1
2
3
4
5
6
7
8
9
10
11
12
13
    v=i++;
004113D3  mov         eax,dword ptr [i] 
004113D6  mov         dword ptr [v],eax 
004113D9  mov         ecx,dword ptr [i] 
004113DC  add         ecx,1 
004113DF  mov         dword ptr [i],ecx 
 
    v=++j;
004113E2  mov         eax,dword ptr [j] 
004113E5  add         eax,1 
004113E8  mov         dword ptr [j],eax 
004113EB  mov         ecx,dword ptr [j] 
004113EE  mov         dword ptr [v],ecx
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.06.2011, 18:09
OstapBender, где отличие в скорости?
1
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 18:11
Лучший ответ Сообщение было отмечено как решение

Решение

лады, учту

хотя вот провел тестик
C
1
2
3
4
5
6
7
    int v=0;
 
    for (int i=0; i<INT_MAX/2; )
        v=++i; 
 
 
    std::cout << (double)clock()/CLOCKS_PER_SEC;
выдает 2.328
C
1
2
3
4
5
6
7
    int v=0;
 
    for (int i=0; i<INT_MAX/2; )
        v=i++; 
 
 
    std::cout << (double)clock()/CLOCKS_PER_SEC;
2.593
3
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.06.2011, 18:25
Лучший ответ Сообщение было отмечено как решение

Решение

OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
3
 Аватар для Saiberg
20 / 20 / 2
Регистрация: 23.09.2010
Сообщений: 193
11.06.2011, 18:46  [ТС]
Цитата Сообщение от Maxwe11 Посмотреть сообщение
чушь, для стандартных типов нет разницы в скорости
открыли глаза как не крути mov + add
0
11.06.2011, 19:31

Не по теме:

опять откровения пошли :ghaha:

0
3057 / 1456 / 265
Регистрация: 16.03.2008
Сообщений: 6,491
Записей в блоге: 2
11.06.2011, 20:03
Цитата Сообщение от silent_1991 Посмотреть сообщение
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
Ни когда не задумывался. Попробовал несколько прогонов. Результаты стабильны:
пре - 3.9
пост - 4.62-4.63

Раньше писал писал постфикс. просто наверное впервые столкнулся именно с такой записью. Последнее время стараюсь приучиться использовать префикс, кроме случаев, когда действительно нужен постфикс.
1
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
11.09.2011, 19:00
Я тоже до сих пор использовал в циклах постфиксную форму записи, наверное стоит перейти на префиксную.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
11.09.2011, 19:20
Разница по определению должна быть, просто на POD типах вроде int она не заметна, а ассемблерный код может быть одинаковым просто за счёт того, что умный компилятор оптимизирует этот момент. А вот с итераторами С++ разница может быть существенной. По этому, чтобы голову себе не забивать, пишу всегда префиксный оператор
C
1
2
3
int i;
for ( i = 0; i < SOMEWHAT; ++i )
    /*...*/
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
12.09.2011, 14:03
Цитата Сообщение от silent_1991 Посмотреть сообщение
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
Согласе, таким методом получаем общее процессорное время, которое включает в себя и переключение на сторонние процессы.

OstapBender, попробуй так
C++
1
2
   for (int i=0; i<INT_MAX/2; i++);
   std::cout << (double)clock()/CLOCKS_PER_SEC;
C++
1
2
   for (int i=0; i<INT_MAX/2; ++i);
   std::cout << (double)clock()/CLOCKS_PER_SEC;
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
12.09.2011, 15:03
kazak, повторюсь...
Процессорное время является отличным от фактических часов, потому что оно не включает все потраченное время на ожидание ввода-вывода или когда выполняется некоторый другой процесс. Процессорное время представляется типом данных clock_t, и дано как ряд импульсов времени относительно произвольного базового времени, отмечающего начало одиночного вызова программы.
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
12.09.2011, 15:21
fasked, опыт показывает обратное) Чем больше запущенных программ, тем больше вернется clock.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
12.09.2011, 15:47
kazak, очевидно что в вашем примере i++ оптимизируется в ++i, что про v=i++; сказать нельзя
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
12.09.2011, 16:07
OstapBender, никакой оптимизации. Просто в цикле нет никакой разницы между постфиксом и префиксом совсем (точнее это характерно для одиночного инкремента, записанного отдельным выражением). Для v=i++ тоже разницы большой нет, меняется только порядок действий. Кстати у меня для присваивания инкремента выдает одинаковый результат для постфикса и префикса 3.14-3.17
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2011, 16:07
Помогаю со студенческими работами здесь

Циклы. Напечатать числа в виде таблицы, используя только циклы
4. Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): 1 2 2 ...

Переведите исходные циклы в циклы других форматотв:
Переведите исходные циклы в циклы других форматотв: For i:73 to 122 do в Цикл while: в Цикл repeat: For i:256 downto 100 do в...

Циклы в Паскале (циклы с пост- и предусловием)
Требуется напиcать программу, которая запрашивает числа с клавиатуры до тех пор, пока сумма чисел не превысит 25 или введенное число не...

Циклы с параметром (циклы ДЛЯ)
Заданные векторы X(N) и Y(N) преобразовать по правилу: большее из xi и yi принять в качестве нового значения xi , а меньшее - в качестве...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru