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

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

Например, в следующем пост-коде приращения:

int counter = 10;
int result = 0;

result = counter++ + 10;

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

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

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

Спасибо

Всего 3 ответа


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

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

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

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

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

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

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

В случае counter++ :

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


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

Так что в вашем случае

 result = counter++ + 10; 

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


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

  • Подумайте о предварительном увеличении для the_object the_type как функции:
the_object = the_object + 1;
return the_object;
  • Теперь представьте Post -increment для the_object of 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 к конечному результату . Затем он должен сгенерировать машинный код для присвоения result_of этого result .

когда программа запущена:

  1. CPU должен выполнять counter++

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

  1. Процессор должен выполнить output_of ( counter++ ) + 10

теперь output_of ( output_of ( counter++ ) + 10) - это result_of (10 + 10), что равно 20

  1. Процессор должен выполнить result = result_of ( result_of ( counter++ ) + 10)

сейчас result 20

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

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

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

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

Удачи!


Есть идеи?

10000