Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

постфиксный и префиксный ++

#cpp


for (int i=0;i<100;++i) ;
for (int i=0;i<100;i++) ;


Есть ли разница, как писать, ведь постфиксный ++ сложнее реализовывается?
    


Ответы

Ответ 1



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

Ответ 2



В вызывающем коде лучше использовать префиксные операторы, если только вам не требуется исходное значение, возвращаемое постфиксной версией. Префиксная форма семантически эквивалентна, она вводится практически так же, и зачастую немного эффективнее, так как создает на один объект меньше. Это не преждевременная оптимизация, а устранение преждевременной пессимизации. Саттер, Александреску. Стандарты программирования на C++.

Ответ 3



Результат третьего выражения в for всегда игнорируется, важен только побочный эффект от его выполнения. А значит, весь код, относящийся только к генерации его возвращаемого значения и возврату оного (если в этом контексте "возврат" вообще имеет смысл), может быть безопасно выкинут. Для int i; for (int i=0;i<100;i++) ;, путём удаления мёртвого кода (записи значения, которое далее не используется) компилятор может убрать из i++ весь несущественный код, относящийся к возвращаемому значению этого выражения, оставив только побочный эффект. И получится код, эквивалентный ++i. Важно то, что компилятор здесь не заменяет постфиксный вариант на префиксный, а убирает лишний код из постфиксного, который "по чистой случайности" для int оказывается эквивалентен своему префиксному "братцу". Для других типов эквивалентный код может запросто оказаться другим. ...если ваш компилятор вообще достаточно умён, чтобы так делать. Скорее всего — достаточно. Вот пример в compiler explorer (на самой старой версии компилятора, что я там нашёл), и он даёт одинаковый результат. Попереключайте компилятор, сравните, одинаков ли код.

Комментариев нет:

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