sunjob 0 December 9, 2021 Posted December 9, 2021 · Report post добрый день. разбираю код (обычный си-код, без крестов): 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() Quote Share this post Link to post Share on other sites More sharing options...
Rst7 4 December 9, 2021 Posted December 9, 2021 · Report post 23 minutes ago, sunjob said: вопрос: можно-ли как ни-будь красиво/очевидно/локонично реализовать выход из цикла Именно для таких целей и нужен goto. Не надо его бояться ;) Quote Share this post Link to post Share on other sites More sharing options...
jcxz 52 December 9, 2021 Posted December 9, 2021 · Report post 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; } Quote Share this post Link to post Share on other sites More sharing options...
sunjob 0 December 9, 2021 Posted December 9, 2021 · Report post нафих-нафих, никаких гоутушек нам и даром не надоть :о) если RET переименовать в BREAK ... все становится очевидным, без лишних сущностей :о) Quote Share this post Link to post Share on other sites More sharing options...
jcxz 52 December 9, 2021 Posted December 9, 2021 · Report post 1 час назад, Rst7 сказал: Именно для таких целей и нужен goto. Не надо его бояться ;) Я тоже его никогда не использую. Так как с goto код становится ещё более трудночитаемым. Слышали термин "вермишельная логика"? Вот тем оно и становится. Quote Share this post Link to post Share on other sites More sharing options...
sunjob 0 December 9, 2021 Posted December 9, 2021 · Report post 1 minute ago, jcxz said: на кой в каждой точке выхода RET присваиваются разные значения? спросите того, кто это написал :о) Quote Share this post Link to post Share on other sites More sharing options...
jcxz 52 December 9, 2021 Posted December 9, 2021 · Report post 1 минуту назад, sunjob сказал: спросите того, кто это написал :о) Так и переименуйте! #define EXIT_FROM_FOR() (RET = 0) ... #undef EXIT_FROM_FOR Quote Share this post Link to post Share on other sites More sharing options...
sunjob 0 December 9, 2021 Posted December 9, 2021 (edited) · Report post jcxz ваш коде (который первый) очевиден для "написания", но не очевиден для "начитания" :о) когда код раздутый с трехэтажным матом, на несколько страниц я самым оптимальным нашел переименвание в BREAK , или точнее, BREAK=0 :o) спасибо Edited December 9, 2021 by sunjob Quote Share this post Link to post Share on other sites More sharing options...
Rst7 4 December 9, 2021 Posted December 9, 2021 · Report post 9 minutes ago, jcxz said: Я тоже его никогда не использую. Так как с goto код становится ещё более трудночитаемым. А с вот этими чудо-костылями он более читаемый? И следующий вопросс - повезет ли Вам с оптимизацией, что это действительно превратится в коде в одну команду перехода, а не в насилие над переменными? 10 minutes ago, jcxz said: Слышали термин "вермишельная логика"? Вот тем оно и становится. Просто метки надо называть не aaaa, а вменяемо ;) И раз уж пошел такой разговор, то насилие над счетчиком цикла в нескольких местах - это моветон похуже goto. Ну да ладно, срач про goto - он вечен Quote Share this post Link to post Share on other sites More sharing options...
sunjob 0 December 9, 2021 Posted December 9, 2021 (edited) · Report post используфте наздоровье ваш goto где вам удобно Quote насилие над счетчиком цикла в нескольких местах никакого насилия нет, все уже давно отрихтовано ... (написано же в начале, что разбираюсь с чужим кодом! а писать свой с нуля и разбираться/рихтовать чужой код это не один и тот-же чукча) Edited December 9, 2021 by sunjob Quote Share this post Link to post Share on other sites More sharing options...
Rst7 4 December 9, 2021 Posted December 9, 2021 · Report post 5 minutes ago, sunjob said: никакого насилия нет, все уже давно отрихтовано ... В смысле нет? Вы изменяете переменную цикла в нескольких местах. В самом заголовке for (нормальное место) и в ветках switch. С точки зрения академичской науки (именно той, которая против goto) - это тоже смертный грех. Или у Вас, как щас принято, "вы не понимаете, это другое!!!!!!!"? Quote Share this post Link to post Share on other sites More sharing options...
jcxz 52 December 9, 2021 Posted December 9, 2021 · Report post 38 минут назад, Rst7 сказал: А с вот этими чудо-костылями он более читаемый? Именно так. У меня все операторы разбиты отступами по уровням вложенности. И поэтому легко найти точки выхода и блоков (switch, for, ...). Когда я вижу break - отматываю на хорошо видимый конец блока, continue - на начало. А goto ломает всю эту систему и становится нечитаемым большой и сложный код, со многими уровнями вложенности. Цитата И следующий вопросс - повезет ли Вам с оптимизацией, что это действительно превратится в коде в одну команду перехода, а не в насилие над переменными? Я имею привычку смотреть в листинги регулярно. Поэтому и знаю, что не "повезёт/не_повезёт", а так и оно и будет. Скорей всего будут просто переходы из всех точек (RET=...) в одну, где будет одно присваивание; или же вообще без присваивания - сразу переход за пределы цикла (если за пределами цикла переменная RET не используется). Цитата Просто метки надо называть не aaaa, а вменяемо ;) Дело не в названии меток. А в том, что они рушат форматирование текста. А текст должен быть форматированным. Чтобы был читаемым. Цитата И раз уж пошел такой разговор, то насилие над счетчиком цикла в нескольких местах - это моветон похуже goto. Оптимизирующий компилятор скорее всего вообще эти присваивания (RET=...) выкинет и сразу направит команду перехода за пределы цикла (если за пределами цикла переменная RET не используется). 11 минут назад, Rst7 сказал: В смысле нет? Вы изменяете переменную цикла в нескольких местах. Приглядитесь внимательнее. Там не "переменная цикла" меняется внутри. Quote Share this post Link to post Share on other sites More sharing options...
aaarrr 26 December 9, 2021 Posted December 9, 2021 · Report post 3 minutes ago, jcxz said: У меня все операторы разбиты отступами по уровням вложенности. Так в чем проблема? Метка будет на -1 уровне, хорошо заметна и читаема: int func(void) { int res = 0; for() { switch() { } } exit: return res; } Quote Share this post Link to post Share on other sites More sharing options...
Rst7 4 December 9, 2021 Posted December 9, 2021 · Report post 9 minutes ago, jcxz said: Приглядитесь внимательнее. Там не "переменная цикла" меняется внутри. Согласен, недоглядел. Применен другой способ прострелить себе ногу, куда более изощренный 3 minutes ago, aaarrr said: Метка будет на -1 уровне, хорошо заметна и читаема: "Вы не понимаете, это другое" (С) Quote Share this post Link to post Share on other sites More sharing options...
jcxz 52 December 9, 2021 Posted December 9, 2021 · Report post 2 минуты назад, aaarrr сказал: Так в чем проблема? Метка будет на -1 уровне, хорошо заметна и читаема: int func(void) { int res = 0; for() { switch() { } } exit: return res; } Это похоже на рюкзак: всё упаковано, уложено как надо. ...Но один гвоздь торчит в сторону и колет спину. Quote Share this post Link to post Share on other sites More sharing options...