LINUX.ORG.RU

«break to out» from for/switch

 , , , ,


0

1

добрый день.
разбираю код (обычный си-код, без крестов):

1. switch вложен в for
2. выброс реализован «хаком» условия for

все работает, но при «обычном» многостраничном операторе switch-case такой выход «неочевиден».

вопрос: можно-ли как ни-будь красиво/очевидно/локонично реализовать выход из цикла

for(i=1; i<RET; i++)
{
...
switch(i)
  {
  case 10:
  if() 
    {
    ...
    RET = 11; // break to out
    }
  break;
  ...
  case 20:
  if() 
    {
    ...
    RET = 21;
    }
  break;
  ...
  case 30:
  if() 
    {
    ...
    RET = 31;
    }
  break;
  }   // switch()
}     // for()

★★★★

Последнее исправление: sunjob (всего исправлений: 1)

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

ты должен был как бы сам прийти к выводу, что goto вообще не нужен, но ты слишком упорот. поке

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

вы положили на инкапсуляцию - зачем вытаскивать из исходной функции реализацию наружу?

довольно таки своеобразное понимание инкапсуляции

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

я просил пример, который без goto НЕ НАПИСАТЬ

а не надо просить такой пример. это глупости - просить такой пример.

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

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

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

довольно таки своеобразное понимание инкапсуляции

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

попробуйте обосновать торчащую майку из ширинки вашего прекрасного кода.

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

противоречит DRY, а твои goto - KISS. дерьмоархитектура

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

аргумент - «можно без» вовсе не значит - «нужно без». «можно» не значит «нужно». на улицу можно ходить через окно, но нужно через дверь. код должен быть читаем и легко корректно модифицируемым, и все остальное - ложно.

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

без функций нельзя

Да как нельзя — можно же! Именно без функций и писали в древние времена погромисты на фортране и васике — просто джампались в нужный кусок кода, и обратно. Именно это и критиковал Дейкстра. Но ви-ж зачем-то превратили это в религиозный догмат на все времена GOTOЭТОПЛОХОПОТОМУЧТОЭТОПЛОХО.

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

лапша из goto - это типичная «программа» на basic под zx

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

еще… в каких-то там языках(счас не помню) блоки кода вообще имеют финализаторы, то есть есть секция типа finally, и по выходу из блока, ВСЕГДА выполняется этот финализирующий код.

типа

{
...
 if(some_bool) break; ///тут будет переход на finally секцию
...

finally
  ///этот код всегда будет исполнен при выходе из блока
  ...
}

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

очевидно, что в си/с++ это эмулируется через goto.

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

Мы тебе верим, верим. Только ты этому коту в скафандре ничего не объяснишь, зря стараешься.

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

это вообще не то, кроме похожести «finally».

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

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

Goto - наше всё

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

В С есть более строгие гарантии inline или речь про опыт работы с конкретным компилятором?

Строгих гарантий нет. Но я и не написал про гарантию, а только про уверенность. :) Конкретных компиляторов сейчас 2 де-факто: gcc и clang. В описываемой здесь ситуации они работают одинаково хорошо и предсказуемо. Тут у нас простое отделение части кода в функцию. Функции, содержащей switch, даже не обязательно указывать inline, достаточно static.

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

Абсолютно верно. И что примечательно, эти формалисты никогда не заикнутся про какой-нибудь вызов по указателю или POSIX-стандартный setjmp/longjmp, так как Дейкстра про них никаких статей не писал. Зато он недвусмысленно высказывался про ООП. Но эти макаки не в курсе и будут продолжать топить против goto и, в это же время, обмазываться ООП на любимом JS. Лул.

anonymous
()

возможно пригодиться URL

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