Pre vs Post Увеличение - PullRequest
       12

Pre vs Post Увеличение

7 голосов
/ 17 мая 2019

Я получаю основу для пре- и постинкрементного увеличения, но у меня возникают проблемы с обертыванием, когда это происходит на самом деле.*

Я понимаю, что Счетчик выйдет как 11, а результат будет равен 20. Является ли Результат результатом 20, потому что выполняется вся функция, а ТО добавляет +1, когда программа переходит квернуть 0;?

Когда именно это +1 добавляется?

Спасибо

Ответы [ 3 ]

6 голосов
/ 17 мая 2019

Когда именно это +1 добавляется?

Согласно стандарту :

Вычисление значения выражения ++ выполняется до изменения объекта операнда.

С точки зрения непрофессионала:

  1. Последовательность вычислений counter является последовательной, что может быть частью всей RHS инструкции или просто термина counter++.
  2. Вычисление counter += 1 выполняется до того, как будет выполнен следующий оператор в программе.

Есть две вещи, которые нужно иметь в виду.

  1. Значение термина - то, к чему оно относится в выражении.
  2. Побочные эффекты оценки термина.

В случае counter++:

Значение термина - это значение counter до его увеличения.
Побочным эффектом оценки термина является увеличение значения counter.

3 голосов
/ 17 мая 2019

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

  • представьте pre -инкремент для the_object из the_type как функцию, подобную этой:
the_object = the_object + 1;
return the_object;
  • теперь вспомним Post -инкремент для the_object из the_type как функцию, подобную этой:
the_type backup_of_the_object;
backup_of_the_object = the_object;
the_object = the_object + 1;
return backup_of_the_object;

Теперь рассмотрим:

result = counter++ + 10;

Когда программа компилируется:

  1. компилятор видит result = в начале строки, поэтому он сначала следует определить, что находится справа от = и затем создайте машинный код, чтобы присвоить его левой стороне = что составляет result.
  2. компилятор видит counter но оператор не закончился потому что ; еще не достигнуто. Так что теперь он знает, что это также должен что-то делать с counter.
  3. компилятор видит ++, но оператор не закончился. Так что теперь это знает, что он должен рассмотреть создание машинного кода для выполнения counter++ первый.

  4. компилятор видит +. Так что теперь он знает, что он должен учитывать создание машинного кода для добавления правой стороны + и левая сторона +, которая была counter++.

  5. Компилятор видит 10; и, наконец, оператор закончился. А сейчас он знает все, что нужно было знать! Он знает, что после производства машинный код для выполнения counter++, он должен произвести машинный код для добавления 10 к output_of it. Тогда это должно создайте машинный код для присвоения output_of этому result.

при запуске программы:

  1. ЦП должен работать counter++

теперь counter увеличивается на 1, следовательно, это 11 , но output_of (counter++) является предыдущим значением counter 10

  1. ЦП должен работать output_of (counter++) + 10

сейчас output_of ( output_of (counter++) + 10) равно output_of (10 + 10), что 20

  1. ЦП должен работать result = результат_ ( результат_ (counter++) + 10)

сейчас result - 20

Также обратите внимание, что все описанные этапы были только о
result = counter++ + 10;
независимо от того, что произойдет потом. Значение до

cout << "Counter: " << counter << endl;
cout << "Result: " << result << endl;

так очевидно, прежде чем main() вернет 0.

По-моему, вы должны успокоиться и научиться этому на опыте, написав и запустив некоторые программы!

Удачи!

3 голосов
/ 17 мая 2019

Оператор постинкремента: Оператор постинкремента используется для увеличения значения переменной после полного выполнения выражения, в котором используется постинкремент.В Пост-Приращении значение сначала используется в выражении, а затем увеличивается.

Таким образом, в вашем случае

result = counter++ + 10;

пост-увеличение происходит после того, как оно было использовано в этом операторе, иочевидно, это отражено в следующем утверждении.

...