Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

Циклы - C++
Воозникли трудности. Можете помочь ?) Необходимо протабулировать функции, зависящее от 2 переменных или от нескольких параметров....

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

Циклы - C++
В последовательности символов выдать на печать TRUE, если значение последнего символа равно F Помогите пожалуйста

На циклы do while - C++
даны два действительных числа а1,а2,... . Известно, что а1&gt;0 и что среди а2,а3,... есть хотя бы одно отрицательное число. Пусть а1,...,аn -...

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

циклы do while - C++
do { if (a&gt;=b) a%=b; else b%=a; } while (a*b&gt;0); объясните...

циклы for, while - C++
for: Среди всех n-значных чисел (n = 1,2,3,4) указать те, сумма цифр которых равна данному числу k. while: Дано натуральное число n....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 14:03     i++ vs ++i (циклы) #16
Цитата Сообщение от 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;
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.09.2011, 15:03     i++ vs ++i (циклы) #17
kazak, повторюсь...
Процессорное время является отличным от фактических часов, потому что оно не включает все потраченное время на ожидание ввода-вывода или когда выполняется некоторый другой процесс. Процессорное время представляется типом данных clock_t, и дано как ряд импульсов времени относительно произвольного базового времени, отмечающего начало одиночного вызова программы.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 15:21     i++ vs ++i (циклы) #18
fasked, опыт показывает обратное) Чем больше запущенных программ, тем больше вернется clock.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.09.2011, 15:47     i++ vs ++i (циклы) #19
kazak, очевидно что в вашем примере i++ оптимизируется в ++i, что про v=i++; сказать нельзя
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 16:07     i++ vs ++i (циклы) #20
OstapBender, никакой оптимизации. Просто в цикле нет никакой разницы между постфиксом и префиксом совсем (точнее это характерно для одиночного инкремента, записанного отдельным выражением). Для v=i++ тоже разницы большой нет, меняется только порядок действий. Кстати у меня для присваивания инкремента выдает одинаковый результат для постфикса и префикса 3.14-3.17
alkagolik
Заблокирован
12.09.2011, 16:11     i++ vs ++i (циклы) #21
Цитата Сообщение от OstapBender Посмотреть сообщение
лады, учту

хотя вот провел тестик
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
это же 2 совершенно разных прораммы. Первая программа выполняет на 1 операцию меньше второй, т.е. значение i = 0 не присваивается переменной v, когда во второй присваивается.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 16:14     i++ vs ++i (циклы) #22
Цитата Сообщение от alkagolik Посмотреть сообщение
Первая программа выполняет на 1 операцию меньше второй, т.е. значение i = 0 не присваивается переменной v, когда во второй присваивается.
Это еще почему?
LosAngeles
Заблокирован
12.09.2011, 16:18     i++ vs ++i (циклы) #23
порядок инструкций другой, их количество одинаково
Цитата Сообщение от alkagolik Посмотреть сообщение
Первая программа выполняет на 1 операцию меньше второй
alkagolik
Заблокирован
12.09.2011, 16:21     i++ vs ++i (циклы) #24
Цитата Сообщение от kazak Посмотреть сообщение
Это еще почему
C++
1
2
3
4
5
6
7
8
9
#include<iostream>
 
int main(){
    int tmp = 5;
    while (tmp) std::cout << --tmp <<'\n';
    tmp = 5;
    while (tmp) std::cout << tmp-- << '\n';
    return 0;
}
Код
$ ./tmp 
4
3
2
1
0

5
4
3
2
1
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 16:23     i++ vs ++i (циклы) #25
alkagolik, что должен означать этот пример?
alkagolik
Заблокирован
12.09.2011, 16:34     i++ vs ++i (циклы) #26
Цитата Сообщение от kazak Посмотреть сообщение
alkagolik, что должен означать этот пример?
то что во втором цикле декремента на 1 больше чем в первом. Условие выхода в обоих случаях одинаково, просто во втором чикле tmp = 0 не выводится на монитор. так что если в первом цикле имеем 5 декрементов, то во втором 6. Префиксная запись устанавливает наивысший приоритет унарной операции, в то время как постфиксный - низший.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
12.09.2011, 16:40     i++ vs ++i (циклы) #27
alkagolik, выдумываешь. Выводятся разные числа, да. Но количество итераций цикла и количество декрементов одинаковое — по 5 в каждом цикле.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.09.2011, 16:42     i++ vs ++i (циклы) #28
Цитата Сообщение от alkagolik Посмотреть сообщение
Условие выхода в обоих случаях одинаково, просто во втором чикле tmp = 0 не выводится на монитор. так что если в первом цикле имеем 5 декрементов, то во втором 6.
А мы это проверим
C++
1
2
3
4
5
6
7
8
9
10
int main(){
    int tmp = 5, i = 0;
    while (tmp) {i++; std::cout << --tmp <<'\n';}
    std::cout << std::endl << i << std::endl;
    tmp = 5;
    i=0;
    while (tmp) {i++; std::cout << tmp-- << '\n';}
    std::cout << std::endl << i << std::endl;
    return 0;
}
alkagolik
Заблокирован
12.09.2011, 16:45     i++ vs ++i (циклы) #29
Цитата Сообщение от grizlik78 Посмотреть сообщение
alkagolik, выдумываешь. Выводятся разные числа, да. Но количество итераций цикла и количество декрементов одинаковое — по 5 в каждом цикле.
Да точно так. Отказываюсь от поста и первой половины поста
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 17:34     i++ vs ++i (циклы)
Еще ссылки по теме:

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

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

Циклы - C++
Нужна помощь с циклом.Есть определенный массив из которого необходимо вытащить данные и поставить в цикл, так же необходимо делать...

циклы - C++
2. Задание 1. Задание взять из таблицы 1 и таблицы 2 согласно варианту. 2. Разработать блок-схемы алгоритма. 3. Написать и отладить...

циклы - C++


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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.09.2011, 17:34     i++ vs ++i (циклы) #30
Цитата Сообщение от kazak Посмотреть сообщение
Просто в цикле нет никакой разницы между постфиксом и префиксом совсем
Вообще по идее разница должна быть, поскольку при постинкременте всё равно создаётся временный объект, который в случае цикла тут же и уничтожается. Вот на это создание-уничтожение какое-то время да тратится.
Yandex
Объявления
12.09.2011, 17:34     i++ vs ++i (циклы)
Ответ Создать тему
Опции темы

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