14
Вчера в универе зашел спор на вот такую тему: чему будет равно 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 или что угодно еще – попробуйте на них выполнить данный код. Результат можно в коменты, добавлю в пост.
