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

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

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

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

11.06.2011, 15:05. Просмотров 4485. Ответов 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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.09.2011, 14:03 #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;
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.09.2011, 15:03 #17
kazak, повторюсь...
Процессорное время является отличным от фактических часов, потому что оно не включает все потраченное время на ожидание ввода-вывода или когда выполняется некоторый другой процесс. Процессорное время представляется типом данных clock_t, и дано как ряд импульсов времени относительно произвольного базового времени, отмечающего начало одиночного вызова программы.
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.09.2011, 15:21 #18
fasked, опыт показывает обратное) Чем больше запущенных программ, тем больше вернется clock.
0
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.09.2011, 15:47 #19
kazak, очевидно что в вашем примере i++ оптимизируется в ++i, что про v=i++; сказать нельзя
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.09.2011, 16:07 #20
OstapBender, никакой оптимизации. Просто в цикле нет никакой разницы между постфиксом и префиксом совсем (точнее это характерно для одиночного инкремента, записанного отдельным выражением). Для v=i++ тоже разницы большой нет, меняется только порядок действий. Кстати у меня для присваивания инкремента выдает одинаковый результат для постфикса и префикса 3.14-3.17
0
alkagolik
Заблокирован
12.09.2011, 16:11 #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, когда во второй присваивается.
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.09.2011, 16:14 #22
Цитата Сообщение от alkagolik Посмотреть сообщение
Первая программа выполняет на 1 операцию меньше второй, т.е. значение i = 0 не присваивается переменной v, когда во второй присваивается.
Это еще почему?
0
LosAngeles
Заблокирован
12.09.2011, 16:18 #23
порядок инструкций другой, их количество одинаково
Цитата Сообщение от alkagolik Посмотреть сообщение
Первая программа выполняет на 1 операцию меньше второй
0
alkagolik
Заблокирован
12.09.2011, 16:21 #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
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.09.2011, 16:23 #25
alkagolik, что должен означать этот пример?
0
alkagolik
Заблокирован
12.09.2011, 16:34 #26
Цитата Сообщение от kazak Посмотреть сообщение
alkagolik, что должен означать этот пример?
то что во втором цикле декремента на 1 больше чем в первом. Условие выхода в обоих случаях одинаково, просто во втором чикле tmp = 0 не выводится на монитор. так что если в первом цикле имеем 5 декрементов, то во втором 6. Префиксная запись устанавливает наивысший приоритет унарной операции, в то время как постфиксный - низший.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
12.09.2011, 16:40 #27
alkagolik, выдумываешь. Выводятся разные числа, да. Но количество итераций цикла и количество декрементов одинаковое — по 5 в каждом цикле.
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.09.2011, 16:42 #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;
}
0
alkagolik
Заблокирован
12.09.2011, 16:45 #29
Цитата Сообщение от grizlik78 Посмотреть сообщение
alkagolik, выдумываешь. Выводятся разные числа, да. Но количество итераций цикла и количество декрементов одинаковое — по 5 в каждом цикле.
Да точно так. Отказываюсь от поста и первой половины поста
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.09.2011, 17:34 #30
Цитата Сообщение от kazak Посмотреть сообщение
Просто в цикле нет никакой разницы между постфиксом и префиксом совсем
Вообще по идее разница должна быть, поскольку при постинкременте всё равно создаётся временный объект, который в случае цикла тут же и уничтожается. Вот на это создание-уничтожение какое-то время да тратится.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2011, 17:34
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.09.2011, 17:34
Ответ Создать тему
Опции темы

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