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

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

Войти
Регистрация
Восстановить пароль
 
Doctor_
234 / 234 / 71
Регистрация: 03.02.2011
Сообщений: 1,431
#1

Объяснить разницу между префиксным и постфиксным инкрементом на простых примерах - C++

27.10.2011, 11:28. Просмотров 50717. Ответов 8
Метки нет (Все метки)

Можете объяснить разницу между i++ и ++i на просто примере с цифрами?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2011, 11:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объяснить разницу между префиксным и постфиксным инкрементом на простых примерах (C++):

Передача параметров в sprintf - объяснить разницу в двух примерах - C++
Заметил, что результат sprintf(line, "%.2f" format, 1.0f);отличается от sprintf(line, "%.2f" format, 0x3f800000);Во втором случае...

Скобки не работают с постфиксным инкрементом - C++
Почему скобки не работают с постфиксным инкрементом ? Программа должна вывести 1, а выводит 0. Без скобок приоритет постфиксного инкремента...

Объяснить разницу между объявлениями массивов - C++
Добрый. Расскажите в чем разница между: double **MatrixA; double *MatrixA; double MatrixA;

Объяснить разницу между int64_t, int_fast64_t и int_least64_t - C++
Есть вот такое: я чего то не пойму, чем отличаются обычные с _t, от fast и least ? Судя по typedef-ам - один хрен: typedef...

Объяснить разницу между массивом типа char и строкой в стиле Си (нюансы использования нуль-терминатора) - C++
Господа, появился такой вопрос: какое место занимает \0 в массиве charов? В данном коде пытался выйти из цикла по достижении...

Просьба объяснить работу std::thread в двух коротких примерах кода - C++
Доброго времени суток! Я использую std::thread чтобы поднять два разных потока. В первом случае всё работает хорошо. Во втором нет. ...

8
VenCarbon
33 / 32 / 3
Регистрация: 14.12.2010
Сообщений: 158
27.10.2011, 11:41 #2
C
1
2
3
4
5
6
int x = 5;
int y;
 
y = ++x; // y = 6, x = 6:  сначала увеличивается x на 1, потом y = x.
y = --x; // y = 5, x = 5: сначала уменьшается x на 1, потом y = x.
y = x++; // y = 5, x = 6: сначала присваивается значение y = x, потом x увеличивается на 1.
все дело в приоритете операций) ++x - выполняется сначала, x++ - потом, после всех остальных операций.
2
aas_
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 7
27.10.2011, 12:07 #3
Цитата Сообщение от VenCarbon Посмотреть сообщение
C
1
2
3
4
5
6
int x = 5;
int y;
 
y = ++x; // y = 6, x = 6:  сначала увеличивается x на 1, потом y = x.
y = --x; // y = 5, x = 5: сначала уменьшается x на 1, потом y = x.
y = x++; // y = 5, x = 6: сначала присваивается значение y = x, потом x увеличивается на 1.
все дело в приоритете операций) ++x - выполняется сначала, x++ - потом, после всех остальных операций.
Не знаю насчет C++, но про C точно помню, x++ и ++x одинаковый приоритет имеют. Разница только в возвращаемом значении, а не приоритете
0
VenCarbon
33 / 32 / 3
Регистрация: 14.12.2010
Сообщений: 158
27.10.2011, 12:30 #4
Цитата Сообщение от aas_ Посмотреть сообщение
Не знаю насчет C++, но про C точно помню, x++ и ++x одинаковый приоритет имеют. Разница только в возвращаемом значении, а не приоритете
В выражениях типа
C
1
2
3
int i = 0;
for (i = 0; i < n; i++) { // здесь можно написать (i = 0; i < n; ++i)
}
действительно, не играет роли.

Но в выражениях типа
C
1
j = (k++) - (--i)
как раз важно, где поставлен инкремент/декремент. значение j будет разным. попробуйте поиграть с такими вещами)
2
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.10.2011, 12:40 #5
Цитата Сообщение от aas_ Посмотреть сообщение
Не знаю насчет C++, но про C точно помню...
В java, С, С++, С# операции инкремента и декремента могут быть в префиксном и постфиксном вариантах. Так вот если выражение простое, то это одно и тоже, а вот если выражение составное, то результат зависит от формы данных операций.
1
Splitter
202 / 144 / 5
Регистрация: 13.01.2009
Сообщений: 554
27.10.2011, 12:46 #6
Цитата Сообщение от VenCarbon Посмотреть сообщение
В выражениях типа
C
1
2
3
int i = 0;
for (i = 0; i < n; i++) { // здесь можно написать (i = 0; i < n; ++i)
}
действительно, не играет роли.
тут тоже могут быть свои нюансы
1
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.10.2011, 18:12 #7
Цитата Сообщение от VenCarbon Посмотреть сообщение
++x - выполняется сначала, x++ - потом, после всех остальных операций.
Цитата Сообщение от VenCarbon Посмотреть сообщение
y = x++; // y = 5, x = 6: сначала присваивается значение y = x, потом x увеличивается на 1.
Это не так. Рассмотрим код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
class A {
public:
    A &operator= (const A &rhs)
    {
        if (this == &rhs)
            return *this;
        std::cout << "operator=\n";
        return *this;
    }
    A operator++ (int)
    {
        std::cout << "postfix operator++\n";
        return *this;
    }
};
 
int main()
{
    A x, y;
 
    x = y++;
 
    return 0;
}
вывод
postfix operator++
operator=


Разница в том что постфиксная форма возвращает старое значение обьекта, а префиксная уже измененное.
Но приоритет и порядок вычисления операторов тот же самый.
1
Captain Maxee
Велосипедист...
253 / 175 / 39
Регистрация: 15.12.2015
Сообщений: 657
10.02.2017, 04:25 #8
Поддерживаю.
Цитата Сообщение от aas_ Посмотреть сообщение
Не знаю насчет C++, но про C точно помню, x++ и ++x одинаковый приоритет имеют. Разница только в возвращаемом значении, а не приоритете
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Разница в том что постфиксная форма возвращает старое значение обьекта, а префиксная уже измененное.
Но приоритет и порядок вычисления операторов тот же самый.
Еще хотелось бы сказать, что ++operator быстрее, чем operator++;
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
10.02.2017, 05:13 #9
Цитата Сообщение от aas_ Посмотреть сообщение
но про C точно помню, x++ и ++x одинаковый приоритет имеют.
И в С, и в С++ постфиксные операторы всегда имеют более высокий приоритет, чем унарные (т.е. префиксные). Т.е. нет, не одинаковый. Но смысла в сравнении приоритетов ++ в С нет, ибо выражения, в котором эти приоритеты будут соперничать, все равно будут некорректными.

Цитата Сообщение от Captain Maxee Посмотреть сообщение
Еще хотелось бы сказать, что ++operator быстрее, чем operator++
"Быстрее" он или "не быстрее" зависит от массы факторов. Если речь идет о фундаментальных типах, то нет никаких причин для какой-то разницы в скорости между этими операторами.
1
10.02.2017, 05:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2017, 05:13
Привет! Вот еще темы с ответами:

Объяснить разницу в объявлениях указателя - C++
Добрый вечер. Объясните, пожалуйста, в чем разница записи, если я ставлю звездочку двумя способами: int *arrWithDigits = new int; ...

Объяснить разницу в именовании заголовочных файлов - C++
Здравствуйте! Подскажите, пожалуйста, в чем разница между #include&lt;iostream&gt;(в книге по программированию) и #include&lt;iostream.h&gt;(с...

Объяснить работу программы (нахождение простых чисел, решето Эратосфена) - C++
Поясните как работает эта прога а именно : #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { ...

Разница между префиксным и постфиксным написанием - Java SE
Здравствуйте. Пытался объяснить человеку про префиксное и постфиксное прибавление 1 (знаком ++). Вроде бы все понятно , если мы создаем...


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

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

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