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