Постинкрементный оператор

Новости

Вчера в универе зашел спор на вот такую тему: чему будет равно i после выполнения этого участка кода:

int i=0;

i = i++;

Участники дискуссии разделились на 2 части (одни говорили, что значение i будет равно 0, другие – 1). Я считал, что i будет равно нулю. Нам рассказывали как работает этот оператор еще на 1м курсе. Например, если рассмотреть постинкрементный оператор как функцию с одним параметрами, то код этой функции будет таков (псевдоязык):

operator pos++(int& value){
int res =value;
value = value + 1;
return res;
}

Собственно, возвращаем мы временное значение, а не значение переменной, а в преинкременте – мы возвращаем саму переменную. Именно поэтому в С++ только 3я строка не скомпилируется:

int i = 0

++i = 5;

i++ = 5;

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

Язык программирования: Значение i
Java 0
C# 0
C++ 1 – опа…
PHP 0
JavaScript 0

С++ внезапно выдал 1 (VS 2008). Всем кто был за ноль стало интересно в какой момент времени происходит присваивание. Разбираться в декомпилированном коде никто не рвался, поэтому пришлось проверять ан примерах:

int i = 0, p = 0;
p = (i++) + (i++);
std::cout << “i = ” << i << “\n” << “p = ” << p << “\n”;

Вышеприведенный код дал результаты: p=0, i=2.

Получается, инкремент происходит после выполнения 2й строки. Для того, чтобы проверить “не тупо ли” компилятор считает инкременты и вставляет их следующей строкой был написан такой код:

int i = 0, p = 0;
p = (i++ == 0 || i++ == 1);
std::cout << “i = ” << i << “\n” << “p = ” << p << “\n”;

Здесь по краткой схеме вычисляется выражение до || и дальше не вычисляется. Прогнозируемо p = 1, и i = 1. Т.е. все не тупо.

Честно говоря, ради таких экспериментов не хочется ставить другие компиляторы С++. Если у вас есть Borland / RAD / gcc или что угодно еще – попробуйте на них выполнить данный код. Результат можно в коменты, добавлю в пост.

Оставить комментарий