С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.85
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
#1

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

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

Собстно стало интересно почему все пишут
C++
1
2
3
for(ptrdiff i = 0; i < 10; i++) {
 
}
постфиксный инкремент медленнее, а в данном случае в нем смысла я не вижу. для красоты что ли?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2011, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос i++ vs ++i (циклы) (C++):

Заменить в коде циклы for на циклы while - C++
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 =...

Циклы do и while - C++
Приветсвую всех. Прошу помощи в решении двух задач: 1.Составить программу для определения, является ли натуральное число k степенью...

Циклы - C++
1)Используя перебор значений найти все числа из диапазона от n до m, которые при возведении в квадрат дают палиндром 2)В соревнованиях...

Циклы - C++
Дан номер телевизионного канала(от 1 до 5). Вывести на экран наиболее популярные программы заданного канала.

циклы - C++
вывести на экран все целые числа из диапазона от А до Б, кратные трем (А&lt;=B)

циклы - C++
помогите вывести таблицу 4 3 2 1 0 3 2 1 0 2 1 0 1 0 0

46
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.06.2011, 15:09 #2
Цитата Сообщение от Saiberg Посмотреть сообщение
постфиксный инкремент медленнее
???
По идее разницы в бинарном коде быть не должно, так что для красоты.
Лично я пишу постфиксный из-за билдера, там если поставить for и пробел, то автоматически вставляется цикл с постфиксным инкрементом... =)
1
asics
Freelance
Эксперт С++
2850 / 1785 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
11.06.2011, 15:12 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для _не_ встроеных типов принципиально писать префиксный, так как постфиксная запись предполагает создание временного объекта.
5
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2011, 17:41 #4
Цитата Сообщение от Saiberg Посмотреть сообщение
постфиксный инкремент медленнее
чушь, для стандартных типов нет разницы в скорости
1
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 17:46 #5
Maxwe11, есть, просто компиляторы обычно оптимизируют код по их желанию, в таких случаях как for , поэтому разницы и не видно становится
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2011, 18:03 #6
OstapBender, в ассемблерных командах нет разницы(в скорости) между постфиксом и префиксом и это не зависит от компилятора
Код
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
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 18:07 #7
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
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.06.2011, 18:09 #8
OstapBender, где отличие в скорости?
1
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.06.2011, 18:11 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
лады, учту

хотя вот провел тестик
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
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
11.06.2011, 18:25 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
3
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
11.06.2011, 18:46  [ТС] #11
Цитата Сообщение от Maxwe11 Посмотреть сообщение
чушь, для стандартных типов нет разницы в скорости
открыли глаза как не крути mov + add
0
alex_x_x
11.06.2011, 19:31
  #12

Не по теме:

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

0
voral
501 / 481 / 83
Регистрация: 16.03.2008
Сообщений: 2,251
11.06.2011, 20:03 #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
OstapBender, подобные тесты нельзя брать за эталон. Один и тот же код при нескольких прогонах может выдавать кардинальную разницу во времени.
Ни когда не задумывался. Попробовал несколько прогонов. Результаты стабильны:
пре - 3.9
пост - 4.62-4.63

Раньше писал писал постфикс. просто наверное впервые столкнулся именно с такой записью. Последнее время стараюсь приучиться использовать префикс, кроме случаев, когда действительно нужен постфикс.
1
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
11.09.2011, 19:00 #14
Я тоже до сих пор использовал в циклах постфиксную форму записи, наверное стоит перейти на префиксную.
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
11.09.2011, 19:20 #15
Разница по определению должна быть, просто на POD типах вроде int она не заметна, а ассемблерный код может быть одинаковым просто за счёт того, что умный компилятор оптимизирует этот момент. А вот с итераторами С++ разница может быть существенной. По этому, чтобы голову себе не забивать, пишу всегда префиксный оператор
C
1
2
3
int i;
for ( i = 0; i < SOMEWHAT; ++i )
    /*...*/
0
11.09.2011, 19:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2011, 19:20
Привет! Вот еще темы с ответами:

циклы - C++
с точностью е=0.001

Циклы в Cи - C++
Всем привет, в общим столкнулся с проблемой, мне необходимо пробежаться по одной и той же строчке содержащею цифры например 1,2,3,4,5... ...

Циклы - C++
Как написать программу, в которой нужно сложить значения получаемые в цикле? z=sin(\sum_{3}^{10}(a*k+c)) a,c известны

Циклы - C++
Добрый день! Хочу попросить помощи в решении следующей задачи: Условие 1: Напишите программу, рассчитывающую сумму денег, которую вы...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.