LINUX.ORG.RU

do{} while(0) вместо вложенных ифов

 ,


2

4

Привет!
Народ, откуда пошла такая конструкция?

do
{
 if ( !cond0 ) break;
 foo();
 if ( !cond1) break;
 bar();
 //...
 if ( !condN) break;
return true;
} while ( 0 )
return false;


Это нецеловое использование цикла, но действительно смотрится элегантнее вложенных проверок.


Ответ на: комментарий от Iron_Bug

и break - это тоже goto. разницы абсолютно никакой. чисто косметическое визуальное отличие, сделанное для goto-ненавистников :)

как прыгнуть break-ом в произвольное место кода?

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Медленный код всегда можно наоптимизировать

а это ошибка всех гуеписателей. сначала они отмахиваются от качественного кода под лозунгом «а, потом можно переписать», и фигачат говнокод. но это «потом» никогда не наступает. а в итоге - куча тормозного кода, который жрёт ресурсы.

нет, надо сразу думать про алгоритмы. причём как глобально, так и локально. потому что ошибки в глобальной архитектуре приложения не исправить вообще никак, кроме как полным переписыванием с нуля. надо сразу понимать, на каких машинах будет работать приложение. чтобы учитывать особенности архитектуры железа и соответственно проектировать архитектуру приложения. софт не работает в вакууме. он всегда имеет дело с конкретной системой и конкретным процессором.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

Все операторы частные случаи ассемблерной вставки, притом более урезанные. Вывод — оставить только ассемблерные вставки.

peregrine ★★★★★
()
Ответ на: комментарий от Iron_Bug

То что Linux kernel изначально поделка на коленке одного студента тебя не смущает? Да и само ядро прямо сказать не ах какое хорошее, просто свободной альтернативы которой занималось бы больше народу и вливало в него больше денег нету.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Чувак, ты, видимо, просто туп от природы. А тупым действительно нельзя использовать goto.

anonymous
()
Ответ на: комментарий от DuMOHsmol

ЕМНИП, Дейкстра говорил о том, что у блока кода должна быть единственная точка выхода

Тред не читай, сразу отвечай. Он говорил совсем про другое.

no-such-file ★★★★★
()
Ответ на: комментарий от peregrine

но для этого есть оператор break или return

Иногда перед break или return нужно освободить ресурсы. Если точек break или return несколько ты предлагаешь код освобождения копипастить? goto является разумной альтернативой в языках, где нет обработки исключений. Причём сама по себе обработка исключений это по факту тот же goto.

no-such-file ★★★★★
()
Ответ на: комментарий от RazrFalcon

Может raii, а не исключений?

raii это реализация, причём специфичная для крестов. Если бы не было исключений raii было бы не нужно.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

причём специфичная для крестов

С чего бы это? Это есть во всех языках с деструкторами. И даже без них.

Если бы не было исключений raii было бы не нужно.

В Rust нету исключений (как бы), а raii есть.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это есть во всех языках с деструкторами

А деструкторы необходимы только потому, что есть исключения. Иначе было бы достаточно обычных методов, вызываемых явно.

no-such-file ★★★★★
()
Ответ на: комментарий от anonymous

Это более рискованно — как минимум больше шансов сделать опечатку и goto не туда, а потом ищи ошибку по всему коду, вместо одной функции.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

а) неочевидностью области выхода в целом ряде случаев; б) невозможностью разрушить множество областей разом (break/continue 2-3-4-... - ещё хуже по читабельности)

AlexAT
()
Ответ на: комментарий от peregrine

Школота - она и есть школота ) Злоупотреблять нельзя ничем. Я как-то в код Invision нового заглянул... яркий пример оверинжиниринга 120lvl, там и без goto проще выкрасить и выбросить.

AlexAT
()
Ответ на: комментарий от Vit

Конечные автоматы - очень удобный и читабельный паттерн. Но внутри обработчиков тоже своя логика, выносить каждые две строчки в отдельный обработчик - лучше уж goto.

AlexAT
()
Ответ на: комментарий от AlexAT

неочевидностью области выхода в целом ряде случаев

А goto такой очевидный да?

невозможностью разрушить множество областей разом

Плохо, когда тебе надо разрушать множество областей разом. Крайне редко когда это оправдано. Не соответствует KISS.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от Deleted

Может быть код станет более читабельным и в нем можно будет разобраться где именно происходят траблы при работе с диском, не тратя на это 10 лет.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

На мой взгляд, goto здесь лучший выбор(хотя и перечастили). А тормоза - они же не пропадут если это дело перепилить без goto. Какие-то ошибки, быть может, и вызваны именно этим, но не настолько глобально же

Deleted
()

В какие-то 90е небось уссатые дяденьки ещё бы и рассказали что это код настоящих тру хакеров, так и надо

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от anonymous

Всяко лучше рандома, когда лучше не станет (я не встречал более читабельного кода с goto чем без goto), а вот хуже волне возможно.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Написать функцию для освобождения ресурсов и вызывать уже её так сложно

И передавать в неё 100500 локальных переменных? Спасибо, но я лучше буду писать goto end;

no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

Ошибаешься

Нет не ошибаюсь. Си обходится без raii. Raii с вызовом деструктора необходим только если выход из скоупа может произойти неконтролируемо (по исключению).

no-such-file ★★★★★
()
Ответ на: комментарий от RazrFalcon

Достаточно деструкторов

Деструкторы это более сложная идея, так что достаточно именно goto, а деструкторы факультативны, если в языке нет исключений.

no-such-file ★★★★★
()
Ответ на: комментарий от peregrine

как минимум больше шансов сделать опечатку и goto не туда

ЛОЛ ЧТО? Даже если предположить вероятность опечатки, то почему опечатка в имени метки более вероятна, чем опечатка и в имени функции (как ты предлагаешь)?

no-such-file ★★★★★
()
Ответ на: комментарий от peregrine

Плохо, когда тебе надо разрушать множество областей разом. Крайне редко когда это оправдано

Вложенные циклы, самый обычный пример. goto из любой вложенности цикла намного более KISS, чем ставить флаг и последовательно в каждом скоупе проверять и делать break.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

raii было бы не нужно

Raii с вызовом деструктора необходим только если

В текущей формулировке не ошибаешься, в исходной - да

Deleted
()
Ответ на: комментарий от Deleted

В текущей формулировке

Так бы и сказал, что ты плохо понимаешь по-русски. Нечего валить на меня свои проблемы восприятия.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Научись непротиворечиво и однозначно излагать свои мысли вместо того, чтобы транслировать потоки сознания

Deleted
()
Ответ на: комментарий от Deleted

Научись непротиворечиво и однозначно излагать свои мысли

Научись молчать, или задавать уточняющие вопросы, если чего-то не понял. Я не обязан знать, какие тараканы у тебя в голове.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

При желании что-либо сказать - говори нормально, а не пытайся написать ахинею и обвинить других в неверности своих высказываний. Либо перечитай свой последний пост - к тебе он хорошо применим

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.