2010-10-15 4 views

ответ

3

i ++ - это постинкремент и ++ i - преинкремент. Первый позволяет использовать значение i в выражении, а затем увеличивает i в конце. Более поздние приращения i сначала, а затем позволяют использовать его. Например:

int value_of_i_before_increment=i++; 

и

int value_of_i_after_increment=++i; 
+0

+1: Именование как current_i было бы лучше, хотя. – bjskishore123

+0

@ bjskishore123, Изменено, чтобы сделать его более очевидным ... –

2

я ++ приращений я после заявления. ++ i увеличивает значение i до того, как вычисляется оператор.

2

Да.

i ++ - это пост-приращение. Он возвращает копию i, а THEN увеличивает значение i.

++ i является предварительным приращением. Он увеличивает i и THEN возвращает значение i.

+3

Подождите, подождите. Специфика заказа не указана (это означает, что многие новички ошибаются и начинают полагать, что определенные выражения на C++ должны иметь на практике четко определенный эффект). i ++ - это пост-инкремент, потому что «++» приходит после (post) «i»; он увеличивает значение «i» и возвращает исходное значение «i» в определенном порядке. :-) Я знаю, это может показаться сумасшедшим, когда вы думаете о том, как это сделать в качестве задания. То, что вам нужно подумать, чтобы понять, как компилятор может поддерживать ценности в реестрах и повторно использовать их. –

+0

@Alf P. Steinbach: Правильно ли я говорю, что ваша точка не имеет практического эффекта, если вы не делаете то, что уже небезопасно? Или это может возникнуть как-то в однопоточной среде? –

+1

@ Шкот: нет до 1-го, да до 2-го. Рассмотрим '++ x = 42'. Когда вы думаете о предварительном приращении как первом приращении, а затем создаете ссылку на x, как это может привести к чему-либо, кроме x, равному 42? Тем не менее это формально UB в C++ 98, так как он дважды меняет x между точками последовательности. Это связано с тем, что позволяет компилятору * предположить *, что будет самое большее одно изменение x, и что x не будет изменен и не использован, поэтому он может делать что-то в реестрах и не беспокоится о конечном значении, которое («правый» или «неправильный»), он может просто хранить в памяти в самом конце полного выражения. –

1

++c pre-increment, поэтому вы увеличиваете значение до его использования, а c++ - это пост-инкремент, поэтому вы используете значение, а затем увеличивайте его.

int c; 
c = 5; 
cout << c++; // prints 5, then sets the value to 6 
c = 5; 
cout << ++c // sets the value to 6, then prints 6 

Так что это может иметь последствия в петлях, и т.д., т.е.

int i; 
for (i=0; i < 2; i++) cout << i; // prints 0, then 1 
for (i=0; i < 2; ++i) cout << i; // prints 1, then 2 

Есть также потенциальные последствия производительности. См. this post для получения дополнительной информации.

Смежные вопросы