Выполняет ли приращение постфикса приращение не возвращаемого значения? - PullRequest
0 голосов
/ 09 января 2011

Опять глупый вопрос.

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
 int i = 0;
 i = i++;
 cout<<i;

 return 0;
}

В результате этой программы я напечатал 1, хотя ожидал 0: сначала создается временный объект, равный 0, затем увеличивается значение i, затемвременный объект возвращается и присваивается i.Просто в соответствии с:

5.2.6 Увеличение и уменьшение [expr.post.incr] 1 Значение, полученное путем применения постфикса ++, является значением, которое операнд имел до применения оператора.[Примечание: полученное значение является копией исходного значения]

Я проверил его в соответствии с MS VC 2008 и GCC.Они дают одинаковый результат, хотя по крайней мере gcc выдает предупреждение в строке приращения.Где я не прав?

1 Ответ

0 голосов
/ 09 января 2011

Поведение

i = i++;

не определено. Если одно выражение присваивает переменной два разных значения, спецификация C ++ говорит, что может произойти все что угодно - оно может принять свое старое значение, одно из двух новых значений или почти что угодно. Причина этого заключается в том, что он позволяет компилятору выполнять более агрессивные оптимизации простых выражений. Компилятор может изменить порядок, в котором выполняются присваивание и ++, например, если он считает, что это более эффективно.

...