Основы программирования на С++ для начинающих

Инкремент и декремент в С++

В предыдущей статье мы с вами рассмотрели бинарные операторы, которые используют для арифметических операций с двумя операндами (переменными). А в этом уроке мы научимся применять унарные операторы, для которых необходим один операнд. Называются они инкремент ( ++ ) и декремент (). Роль этих операторов в том, чтобы изменить (увеличить или уменьшить соответственно) значение переменной на единицу, при этом значение будет перезаписано. Рассмотрим пример, в котором будем изменять значение переменной variable на единицу тремя различными способами:

После каждой операции в строках 11, 13 и 15. к значению переменной variable прибавляется единица. Как вы видите, самая короткая запись – это запись с использованием инкремента. Ниже, в строках 17 – 19, мы трижды применили декремент и в итоге получим значение variable уменьшенное на 3.

Компилируем:

инкремент и декремент

Оба этих унарных оператора могут иметь две формы: постфиксную ( когда оператор расположен сразу за переменной) и префиксную (оператор расположен перед переменной). В рассмотренном примере мы применяли постфиксные формы инкремента и декремента. Чем же отличаются эти формы друг от друга? И первая и вторая формы этих операторов выполняют одинаковые роли – увеличение или уменьшение переменной на единицу. Но если в строке кода, где применяются инкремент или декремент, присутствуют еще какое-либо команды, тогда эти операторы по-разному себя ведут. Постфиксная форма будет применена после выполнения других команд. Посмотрим на следующем примере:

В результате выполнения кода строки 12, мы увидим на экране число 0. Так произойдет потому, что увеличение на единицу выполнится после вывода значения переменной variable на экран. Чтобы убедиться, что значение действительно изменилось – в строке 13 просим показать нам variable. А вот в случае применения префиксной формы инкремента (строка 16), переменная сразу перезапишется и уже только после этого произойдет вывод на экран. Для декремента всё то же самое, но с уменьшением на единицу.

Компилируем:

инкремент и декремент

Вот посмотрите еще на этот пример:

Результат:
инкремент и декремент

Постарайтесь понять, почему в результате операций строки 11, переменная a стала равна 10. Задавать вопросы в комментариях не запрещается.

81 thoughts on “Инкремент и декремент в С++

  1. а если инкрементов куча и все и сложение и вычитание а в конце было умножение,как двигаться снизу вверх или сверху вниз после умножения

  2. ++variable + 1 + ++variable * 2=( 2+1+2) *2=10
    1-ое действие: ++variable;
    2-ое действие: ++variable;
    3-е и 4-ое действия: сложение с единицей;
    5-ое действие: *2.

    1. Тут ты немного не прав, действия идут иначе:
      1) ++variable; 1+1=2
      2)++variable; 2+1=3 при этом первое значение variable тоже меняется
      3)итого получаем 3+1+3*2=10

      1. что то не согласен:
        1) ++variable; 1+1=2
        2)++variable; 2+1=3 при этом первое значение variable тоже меняется – НЕ меняется!
        3)итого получаем 2+1+3*2=9

  3. Толи я дурак толи компиляторы, 4 разных компилятора выдают 9 а не 10, и почему же это?)

    1. В стандарте Си между двумя точками последовательных вычислений изменение значения переменной возможно не более одного раза.
      В данном случае переменная variable меняется 2 раза в одном выражении. И в каком порядке пойдет вычисление – зависит от версии компилятора:
      либо так: ++var(var=2), ++var(var=3), a=3+1+3*2=10
      либо так: ++var(var=2), a=2+1+(++var)*2=2+1+3*2=9
      мой компилятор также выдал ответ 9.
      Поэтому такие конструкции не нужно никогда использовать, если только для учебных целей

  4. А как на счет посчитать вот такой код?

    int variable = 1;
    int a = 0;
    a = –variable + 1 – variable– * 2 ;

    или такой?
    a = variable– + 1 + –variable * 2 ;

    или хотя-бы такой?
    a = –variable + 1 + –variable * 2 ;

    гы… гы…

  5. Решил у себя в компиляторе разобраться с инкрементами

    int a = 1;
    int b;
    b = ++a + ++a;
    cout << b << endl;

    Тут выводит b = 6, как и задумывалось

    Но стоит лишь мне начать прибавлять последующие инкременты, как всё ломается:

    int a = 1;
    int b;
    b = ++a + ++a + ++a;
    cout << b << endl;

    Должно вывести 12, но почему-то выводит 10. И с последующим прибавлением инкрементов ситуация повторяется – вместо 20 выводит 15

    1. может: int b=0;
      чтоб мусор не засасывал из памяти в виду отсутствия определённости

  6. по правилам сначала выполнил умножение : 2 * 2 = 4
    далее : 2 + 1 + 4 = 7 .
    если правильный ответ 10 , то префиксный инкремент должен
    иметь преимущество выполнения перед умножением , однако
    в статье на это не указано .
    поправьте меня или поясните конкретней решение задачи по порядку выполнения знаков !

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *