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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Помогите разобраться в задаче:
    x = y = 0;
    while ( y < 10 ) x += ++ y;
    printf (" x= %d y = %d\n", x, y);

    Ответ x = 55 y = 10
    Я не понимаю как x получается 55. Прям голову сломала(((

    1. x=0+1=1
      x=1+2=3
      x=3+3=6
      x=6+4=10
      x=10+5=15
      x=15+6=21
      x=21+7=28
      x=28+8=36
      x=36+9=45
      x=45+10=55

      pervaya cifra eto zna4enie x a vtoraya cifra eto zna4enie y, vot i resultat, ++y srazu uveli4ivaet zna4enie y na 1

  2. x=0+1=1
    x=1+2=3
    x=3+3=6
    x=6+4=10
    x=10+5=15
    x=15+6=21
    x=21+7=28
    x=28+8=36
    x=36+9=45
    x=45+10=55

    pervaya cifra eto zna4enie x a vtoraya cifra eto zna4enie y, vot i resultat, ++y srazu uveli4ivaet zna4enie y na 1

  3. Кстати, а почему получается число 10 , в строке 11 ?? Я использую CodeBlock как среду. Вначале написал сам код, получил 9. Потом специально скопировал ваш и … снова 9. Я так понимаю, что в процессе расчета,когда обрабатывается второй инкремент, он далее умножается на 2, а только после этого складывается с левой частью команды. Может объясните, почему так ? Или так и должно быть ? Тогда почему у вас 10? Да и вообще, алгоритм несколько не логичным выходит…

  4. Мне не понятно! Если считать правильно, то должно получиться 7, так как – 2+1+2*2 = 7.
    Но 10 получиться, если компилятор воспринял значения (2+1+2) как в скобках, а почему он так воспринял не понятно и как писать, что бы не воспринимал так!?
    А вот больше всего мне не понятно – почему в онлайн компиляторе вообще получается 9!? – я даже не понял как он так посчитал! Может кто-то объяснит?

  5. Так, сейчас понял, что второй инкремент тоже увеличивается – но тогда в онлайн компилляторе правильно – 9, но почему 10 – вот не понятно!?

  6. То есть, на сколько я понял, компилятор сначала вычисляет variable.
    1. variable=1+1, присвоено 2.
    2. variable=2+1, присвоено 3.
    Теперь вычисляется а=3+1+3×2=10. Так?

    1. точно не считал по “программированию”, но как и считал 9 должно должно получиться – так понял – как и в компилляторе… тут может опечатка или что-то вроде того….

      1. Проверил в 2-х онлайн компиляторах, та же петрушка, а=9. Но по идее должно быть 10,т.к приоритет у пре-инкремента 3 RL, а по сему сначала variable вычисляется, а потом уже он принимает участие в примере. И он по-любому равен 3, значит пример должен выглядеть так: а=3+1+3*2. Компиляторы же , видимо, считают последовательно, т.е. а=2+1+3*2, тогда действительно получается 9. Но почему так?! Я что-то не допонял? Эх, кто бы объяснил подоходчивей.

  7. 2+1+2*2
    второй variable все еще хранит значение 1, в тот момент когда первый variable уже 2. но вот арифметика мне пока непонятна. умножение то должно выполняться первым.

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

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