Jump to content
    

"break to out" from for/switch

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

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()

Share this post


Link to post
Share on other sites

23 minutes ago, sunjob said:

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

Именно для таких целей и нужен goto. Не надо его бояться ;)

Share this post


Link to post
Share on other sites

1 час назад, sunjob сказал:

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

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

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

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

Не понятно - на кой в каждой точке выхода RET присваиваются разные значения? Разумнее RET=0 везде. Тогда и компилятор все их объединит, направив все переходы в один адрес.

Другой вариант: заменить все места где сейчас break, на continue, а везде где RET=... поставить break и break в конце for().

for (i = 1; i < RET; i++) {
  ...
  switch (i) {
    case 10:
      if (!(...)) continue;
      ...
      break;
    case 20:
      if (!(...)) continue;
      ...
      break;
      ...      
    default: continue;
  }
  break;
}

 

Share this post


Link to post
Share on other sites

нафих-нафих, никаких гоутушек нам и даром не надоть :о)

если RET переименовать  в BREAK ... все становится очевидным, без лишних сущностей :о)

Share this post


Link to post
Share on other sites

1 час назад, Rst7 сказал:

Именно для таких целей и нужен goto. Не надо его бояться ;)

Я тоже его никогда не использую. Так как с goto код становится ещё более трудночитаемым.

Слышали термин "вермишельная логика"? Вот тем оно и становится.  :wacko:

Share this post


Link to post
Share on other sites

1 minute ago, jcxz said:

на кой в каждой точке выхода RET присваиваются разные значения?

спросите того, кто это написал :о)

Share this post


Link to post
Share on other sites

1 минуту назад, sunjob сказал:

спросите того, кто это написал :о)

Так и переименуйте!

#define EXIT_FROM_FOR() (RET = 0)
...
#undef EXIT_FROM_FOR

:wink:

Share this post


Link to post
Share on other sites

jcxz

ваш коде (который первый) очевиден для "написания", но не очевиден для "начитания" :о) когда код раздутый с трехэтажным матом, на несколько страниц

я самым оптимальным нашел переименвание в BREAK , или точнее, BREAK=0 :o)

 

спасибо

Edited by sunjob

Share this post


Link to post
Share on other sites

9 minutes ago, jcxz said:

Я тоже его никогда не использую. Так как с goto код становится ещё более трудночитаемым.

А с вот этими чудо-костылями он более читаемый? И следующий вопросс - повезет ли Вам с оптимизацией, что это действительно превратится в коде в одну команду перехода, а не в насилие над переменными?   

10 minutes ago, jcxz said:

Слышали термин "вермишельная логика"? Вот тем оно и становится.  :wacko:

Просто метки надо называть не aaaa, а вменяемо ;)

И раз уж пошел такой разговор, то насилие над счетчиком цикла в нескольких местах - это моветон похуже goto.

Ну да ладно, срач про goto - он вечен :biggrin:

Share this post


Link to post
Share on other sites

используфте наздоровье ваш goto где вам удобно :feminist:

Quote

насилие над счетчиком цикла в нескольких местах

никакого насилия нет, все уже давно отрихтовано ... (написано же в начале, что разбираюсь с чужим кодом! а писать свой с нуля и разбираться/рихтовать чужой код это не один и тот-же чукча)

Edited by sunjob

Share this post


Link to post
Share on other sites

5 minutes ago, sunjob said:

никакого насилия нет, все уже давно отрихтовано ...

В смысле нет? Вы изменяете переменную цикла в нескольких местах. В самом заголовке for (нормальное место) и в ветках switch. С точки зрения академичской науки (именно той, которая против goto) - это тоже смертный грех.

Или у Вас, как щас принято, "вы не понимаете, это другое!!!!!!!"? :biggrin:

Share this post


Link to post
Share on other sites

38 минут назад, Rst7 сказал:

А с вот этими чудо-костылями он более читаемый?

Именно так. У меня все операторы разбиты отступами по уровням вложенности. И поэтому легко найти точки выхода и блоков (switch, for, ...). Когда я вижу break - отматываю на хорошо видимый конец блока, continue - на начало.

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

Цитата

И следующий вопросс - повезет ли Вам с оптимизацией, что это действительно превратится в коде в одну команду перехода, а не в насилие над переменными?   

Я имею привычку смотреть в листинги регулярно:wink:  Поэтому и знаю, что не "повезёт/не_повезёт", а так и оно и будет.

Скорей всего будут просто переходы из всех точек (RET=...) в одну, где будет одно присваивание; или же вообще без присваивания - сразу переход за пределы цикла (если за пределами цикла переменная RET не используется).

Цитата

Просто метки надо называть не aaaa, а вменяемо ;)

Дело не в названии меток. А в том, что они рушат форматирование текста. А текст должен быть форматированным. Чтобы был читаемым.

Цитата

И раз уж пошел такой разговор, то насилие над счетчиком цикла в нескольких местах - это моветон похуже goto.

Оптимизирующий компилятор скорее всего вообще эти присваивания (RET=...) выкинет и сразу направит команду перехода за пределы цикла (если за пределами цикла переменная RET не используется).

11 минут назад, Rst7 сказал:

В смысле нет? Вы изменяете переменную цикла в нескольких местах.

Приглядитесь внимательнее. Там не "переменная цикла" меняется внутри.

Share this post


Link to post
Share on other sites

3 minutes ago, jcxz said:

У меня все операторы разбиты отступами по уровням вложенности.

Так в чем проблема? Метка будет на -1 уровне, хорошо заметна и читаема:

int func(void)
{
    int res = 0;
  
    for()
    {
       switch()
       {
       }
    }
exit:
    return res;
}

Share this post


Link to post
Share on other sites

9 minutes ago, jcxz said:

Приглядитесь внимательнее. Там не "переменная цикла" меняется внутри.

Согласен, недоглядел. Применен другой способ прострелить себе ногу, куда более изощренный :biggrin:

3 minutes ago, aaarrr said:

Метка будет на -1 уровне, хорошо заметна и читаема:

"Вы не понимаете, это другое" (С)

:biggrin:

Share this post


Link to post
Share on other sites

2 минуты назад, aaarrr сказал:

Так в чем проблема? Метка будет на -1 уровне, хорошо заметна и читаема:

int func(void)
{
    int res = 0;
  
    for()
    {
       switch()
       {
       }
    }
exit:
    return res;
}

Это похоже на рюкзак: всё упаковано, уложено как надо. ...Но один гвоздь торчит в сторону и колет спину.  :biggrin:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...