• Авторизация


2 + 2 = ? 13-10-2012 02:21 к комментариям - к полной версии - понравилось!



- Гоги, да скажи ты им наконец. Сколько будет дважды два? - Пять! - Да, где-то так. Пять, Шесть.  (из бородатого анекдота).

Попалась на глаза любопытная статья про особенности C++. Самое забавное  место:

Может ли C++ быть веселым? Давайте проверим! :) Я знаю несколько примеров, которые радуют программистский взгляд. И предлагаю взглянуть!

Разомнемся на кошках. Представьте, что вы видите следующий код:

int i = 5;
int j = i++ + ++i;


Чему будет равно j? Вы хорошо подумали? Дело в том, что правильный ответ – где-то от 10 до 14! Мой любимый GCC выдает 12, но это еще не предел. Стандарт C++ не обязывает, чтобы результат оператора ++ был вычислен до операции присвоения, поэтому ответ может меняться от компилятора к компилятору, и даже зависеть от ключей оптимизации. Ведь результат операции i = i++, и тот не определен! Желающие могут погуглить "C++ Sequence point", а мы пойдем дальше. :)

читать статью целиком

Да уж, придумывание оператора ++ (+= и прочих аналогичных) однозначно было злом, чтобы потом на сложных комбинациях народ сломал себе мозг и вместо однозначного упрощения пустился во все тяжкое.

 

вверх^ к полной версии понравилось! в evernote
Комментарии (4):
Gorely 13-10-2012-02:30 удалить
....ох уж эти ваши кодерские неопредеоенности, нам, админам, потом отдуваться... )))))))))))))))))
AUKolosov 13-10-2012-02:41 удалить
Gorely, и не говори. Буквально на днях коллега-разработчик ломал голову, пытаясь понять, что в каком порядке выполняется, на такой конструкции: n = ++*m; (где m - указатель, соотв *m - его разыменовывание т.е. обращение к значению) Здравый смысл победил и моё предложение поставить скобки, однозначно определяющие приоритет операций было воспринято положительно :) Меня все эти отложенные вычисления еще в институте задолбали.
Reeder 13-10-2012-10:02 удалить
AUKolosov, однажды на это наткнувшись я всегда пишу +1 и вообще сятник это мозголомство.....
AUKolosov 13-10-2012-11:17 удалить
Reeder, аккуратность - наш рулевой. Опять же когда пишешь один - можешь делать все, что захочешь. Хуже, когда с такими вещами приходится сталкиваться в команде. Еще хуже - когда такой код достается в наследство (страниц так на двести исходников). Главное - не увлекаться и не совершать в одной строке больше одного действия. А если они неизбежны, как в случае с n = ++*m; не строить из себя знатока потрохов сей и его компиляторов, а тупо сделать: n = ++(*m);


Комментарии (4): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник 2 + 2 = ? | AUKolosov - Дневник Алексея Колосова | Лента друзей AUKolosov / Полная версия Добавить в друзья Страницы: раньше»