"break to out" from for/switch

Модератор: Модераторы разделов

Ответить
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

"break to out" from for/switch

Сообщение sunjob »

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

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()
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: "break to out" from for/switch

Сообщение ormorph »

Похоже это тот момент, когда выгода оператора goto очевидна.
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

да-да... на лоре это уже обсудили :о)
на я нашел более "правильный" подход :о)
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: "break to out" from for/switch

Сообщение ormorph »

Более правильно просто цикл в функцию обернуть, и из функции выходить по return;
Спасибо сказали:
Kopilov
Сообщения: 949
ОС: [K]Ubuntu, Debian

Re: "break to out" from for/switch

Сообщение Kopilov »

Блин, так просто, вся интрига пропала :D
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

ormorph писал(а):
09.12.2021 11:49
Похоже это тот момент, когда выгода оператора goto очевидна.
Более правильно просто цикл в функцию обернуть, и из функции выходить по return;
да-да... все это так... но не всегда "оптимально" :D
в моем случае оказалось удобнее (читай как оптимально) переименовать переменную границ цикла в BREAK и более ни чего с текстом не делать

:drinks:
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: "break to out" from for/switch

Сообщение ormorph »

sunjob писал(а):
09.12.2021 12:37
да-да... все это так... но не всегда "оптимально"
Ну тут оптимальность условна, так как примерно то же самое по скорости и будет при выходе из функции. так как тут ещё идёт лишняя проверка оператором for. Тем более что функция может быть вложенная.

Код: Выделить всё

#include <stdio.h>

int main(int argc, char **argv)
{
        int A=10;
        int B=20;
        int sum(){
                A=A+10;
                B=B+10;
                return A+B;
        };

        printf("sum = %d\n", sum());
        printf("A = %d\n", A);
        printf("B = %d\n", B);
}
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

в данном конкретном случае под "оптимальностью" имелось в виду не "неписаемость" а "начитаемость"... сижу тут, понимаешь, разгребаю чужОй кот ... :о)
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: "break to out" from for/switch

Сообщение Bizdelnick »

Вообще по классике тут goto надо. С понятным именем метки (end_loop или что-то в этом духе) куда более читаемо. А понять, что это за BREAK такой, и как он работает — это ещё репу почесать придётся. И вообще хреновая идея именовать переменные прописными буквами, так обычно макросы называют (ну или константы в крайнем случае).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

Вообще по классике тут goto надо.
нюню... по классике... мои классики не используют такие классики! причем, серьезные ребята... (данный код, естественно не из их болота) :crazy:

Код: Выделить всё

С понятным именем метки (end_loop или что-то в этом духе) куда более читаемо
да-да, очень читаемо будет, данный код на несколько страниц, несколько подобных for()-операторов и на каждый будем придумывать
END_LOOP_OF_ANNA
END_LOOP_OF_BORIS
END_LOOP_OF_VASILIY

А понять, что это за BREAK такой, и как он работает — это ещё репу почесать придётся.
как говорит один кот Кузма Пурткоф, зри в корень! не надо ни какие места чесать! в данном случае все очевидно: встречаем код, типа то это и есть выход из for(), и не важно какой из них... тот, который нужно
вообще хреновая идея именовать переменные прописными буквами
это для наглядности, для непонятливых... :drunk:
Добавлено (13:41):
вообще решение уже давно найдено, все руки не доходят вставить код... :yes3:
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: "break to out" from for/switch

Сообщение Bizdelnick »

sunjob писал(а):
09.12.2021 13:40
мои классики не используют такие классики!
Вам уже и Керниган с Ритчи не угодили? У Вас другие любимые авторы?
В Си имеются порицаемая многими инструкция goto и метки для перехода на них. Строго говоря, в этой инструкции нет никакой необходимости, и на практике почти всегда легко без нее обойтись. До сих пор в нашей книге мы не использовали goto.
Однако существуют случаи, в которых goto может пригодиться. Наиболее типична ситуация, когда нужно прервать обработку в некоторой глубоко вложенной структуре и выйти сразу из двух или большего числа вложенных циклов. Инструкция break здесь не поможет, так как она обеспечит выход только из самого внутреннего цикла.
Добавлено (14:19):
А вообще из приведённого примера суть реального кода совершенно непонятна. Тут может сработать только один case, до других ни при какой погоде дело не дойдёт.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

про цитату из K&R - написано красиво...
но я про своих коллег, боевых парней, которые во всей этой кухне разбираются "аки ять"... боги кода... вот я их иногда донимаю своими дурацкими вопросами и подсматриваю код :о)

а вот это ваше
- а ты знаешо вовку-шкафа с уралмаша?
- а кирпича-петруху...

не катит тут :crazy: все должно быть к месту, ко времени, оптимально ... goto - ни то, ни другое, ни третье имхо
тем более что "оптимум" уже найден :о)

спасибо

зы
Тут может сработать только один case, до других ни при какой погоде дело не дойдёт.
именно, код еще тот... нахреноверчен по самые пАмидоры (в начале же написал, что "разбираюсь в чужом коде" - а чего от него ожидать в таком случае? чукчи они такие)

и да, K&R не классики для меня, я учился по другим книгам, а K&R свою книгу надо было написать как РАСШИРЕННЫЙ СПРАВОЧНИК, а не как художественная книга в декларотивной форме... еЁ же читать невозможно... после странинцЫ апплеваться хочется :cray:
Последний раз редактировалось sunjob 10.12.2021 00:57, всего редактировалось 5 раз.
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: "break to out" from for/switch

Сообщение ormorph »

Видно совсем уж серьёзные ребята. Так как на функциональном языке используют чисто императивные методы. Я конечно понимаю что это ускоряет код, но читабельным он от этого не станет. Читабельным можно сделать разделив на отдельные функциональные блоки, хорошо описанные. Но мне тут тяжело судить со своей колокольни.
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

Видно совсем уж серьёзные ребята
да блин жешь... это не их код... там вообще полный обздрац :yes3:
я просто чужой код залитовавал... вот и решил поинтересоваться как в данном случае выкрутиться и не свИхнуться :cool:
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: "break to out" from for/switch

Сообщение Bizdelnick »

sunjob писал(а):
09.12.2021 14:23
я про своих коллег, боевых парней, которые во всей этой кухне разбираются "аки ять"...
Ну вот у них и спросите, как, по их мнению, лучше: BREAK=0 или goto end_loop. Для меня очевидно, что второй вариант более понятен с первого взгляда, и предпочитать первый нет никаких причин кроме goto-фобии.
sunjob писал(а):
09.12.2021 14:23
именно, код еще тот... нахреноверчен по самые пАмидоры (в начале же написал, что "разбираюсь в чужом коде" - а чего от него ожидать в таком случае? чукчи они такие)
Ну так я к тому, что вообще вся конструкция весьма сомнительно выглядит, и действительно оптимальным решением, возможно, было бы переписать её совсем иначе. Может бы, так, как предложил ormorph, может быть, ещё как-то. Не видя всего кода и не зная, что он делает, этого не понять.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1378
ОС: Slackware

Re: "break to out" from for/switch

Сообщение UnixNoob »

Использовать ключевые слова в качестве чего-либо плохая идея. Надо придумывать что-то более осмысленное в таком случае. Не стоит бояться длинных имен, этот код читать человеку, а не машине.
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

Bizdelnick писал:
09.12.2021 14:39
Ну вот у них и спросите...
нет их под рукой, мы в разных измерениях, изредко пересекаемся :unsure:
но точно не goto! за это они бьют по рукам, голове и на кол сажают (с закруткой на голове)
Ну так я к тому, что вообще вся конструкция весьма сомнительно выглядит, и действительно оптимальным решением, возможно, было бы переписать её совсем иначе
нет, переписывать "несколько страниц" тупого тяжело воспринимаемого кода, с математикой... уж увольте :D :D
нужно было максимально оставить старый код (не дай бог не сломать что Не лишнего), добавить минимально "что-то", что поможет ориентироваться в этой мешанине, причем в минимальные сроки, что было и сделано... единственно оптимально удобное решение конкретно в данном случае :yes3:
Не видя всего кода и не зная, что он делает, этого не понять.
именно :drunk:

p.s. еще раз уточню:
задача тупая и неинтересная: нужно было "залитовать" многостраничный нахреновенчанный код, что бы не ахрененть от переделок и ни чего не сломать... случано...
соответственно и было выбрано решение :unsure: очевидное, понятное и простое :wacko:
спасибо
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

UnixNoob писал:
09.12.2021 16:05
Не стоит бояться длинных имен, этот код читать человеку, а не машине.
именно этим и занимался - ЧИТАЛ ЧУЖОЙ КОД и делал его чуть более ЧИТАБЛЕННЫМ
Использовать ключевые слова в качестве чего-либо плохая идея
а вот тут мона поспорить! во первых, ключ. слово в верхнем регистре, поэтому оно не является в данном случае ключевым, а просто идентификактор и ни с чем не конфликтует. во вторых, именно верхний регистр в данном случае играет главную дудку, бросается в глаза, что помогает ориентироваться в коде. разве это не то, что мы и преследуем - СДЕЛАТЬ ЧИТАБЕЛЬНЫЙ КОД ? я считаю шо не надо гнушаться ни чем, что будет нам помогать (во всем остальном компилятор нам погрозит пальчиком или, если сильно надо, то пнет под зад)
Добавлено (17:31):
два очевидных варианта (коТ на скору лапу, мож че и спЁр лишнего)

Код: Выделить всё

for(i=1; i<BREAK; i++)
{
...
switch(i)
  {
  case 10:
  if() 
    {
    ...
    BREAK = 0; // видим слово BREAK - значить это "то, что надо"
    }
  break;
...
}

либо

#define BREAK 0

for(i=1; i<CNT; i++)
{
...
switch(i)
  {
  case 10:
  if() 
    {
    ...
    CNT = BREAK; // тут вообще все очевидно :о)
    }
  break;
...
}
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
UnixNoob
Сообщения: 1378
ОС: Slackware

Re: "break to out" from for/switch

Сообщение UnixNoob »

sunjob писал(а):
09.12.2021 17:19
а вот тут мона поспорить! во первых, ключ. слово в верхнем регистре, поэтому оно не является в данном случае ключевым, а просто идентификактор и ни с чем не конфликтует. во вторых, именно верхний регистр в данном случае играет главную дудку, бросается в глаза, что помогает ориентироваться в коде. разве это не то, что мы и преследуем - СДЕЛАТЬ ЧИТАБЕЛЬНЫЙ КОД ?
Ну давайте поспорим. Есть некие ключевые слова в яп, и вот вы, зная эти слова начинаете просматривать код. Но тут вдруг человек решает придать этим словам новое значение. При этом это новое значение может быть каждый раз разное и следовать какой-то своей логике. Теперь нам надо не просто держать в голове имена переменных и следить за логикой, но еще помнить что вот это BREAK не break, а совсем другое. А если так будут делать и с другими ключевыми словами, как возрастет нагрузка на эти разграничения?
Хорошо конечно, что вы правила программирования подвергаете критике, но мне кажется, это не та ситуация. Читаемость кода, это не про короткие имена переменных.
А то можно к такому придти:

Код: Выделить всё

life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
"Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные"
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: "break to out" from for/switch

Сообщение Bizdelnick »

sunjob писал(а):
09.12.2021 17:10
но точно не goto! за это они бьют по рукам, голове и на кол сажают (с закруткой на голове)
Ну если и у них фобия (сужу по Вашим словам, на деле может быть иначе), значит, не такие уж они крутые профи, как Вам кажется. Сишечка так устроена, что в отдельных (редких) случаях лучшего средства просто нет. Надо не заученным мантрам следовать, а здравому смыслу.
Добавлено (18:59):
sunjob писал(а):
09.12.2021 14:23
и да, K&R не классики для меня, я учился по другим книгам, а K&R свою книгу надо было написать как РАСШИРЕННЫЙ СПРАВОЧНИК, а не как художественная книга в декларотивной форме... еЁ же читать невозможно... после странинцЫ апплеваться хочется
Справочник и учебник — очень разные вещи, и не взаимозаменяющие, а взаимодополняющие. Они написали именно учебник. В справочнике замечания о том, стоит ли использовать goto, и в каких случаях, были бы совершенно неуместны.
А насчёт того, что читать невозможно, так это скорее справедливо в отношении текстов с внезапно появляющимися среди слова прописными буквами и ошибками вроде «декларотивной» и «апплеваться».
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

BREAK не break
а что сразу не понятно?
life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
ну да... и сравним с
BREAK не break
"математика" она такая, может и к такому прийти :о)
декларОтивной
ударение на О, именно так! видимо вы не читали K&R
читать невозможно ...
пару слов не смогли осилить, где там K&R? :wacko:
Ну если и у них фобия
вам нравиться такой смайлик? :crazy:
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: "break to out" from for/switch

Сообщение Bizdelnick »

sunjob писал(а):
10.12.2021 00:51
у них посерьезней работа, чем торчать на форумах
Не поверите, у меня тоже.
sunjob писал(а):
10.12.2021 00:51
вы должны
Как-то многовато народу последнее время стало рассказывать, якобы я им что-то должен…
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

тенденция, однако! :crazy:
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: "break to out" from for/switch

Сообщение ormorph »

sunjob писал(а):
10.12.2021 00:51
BREAK не break

"математика" она такая, может и к такому прийти :о)
хоть заяц — не заяц, а орёл.
Но как правило это происходит от неправильных высказываний, так как можно сделать так, что при любом задании аргументов вывод будет один и тот же.
Спасибо сказали:
Аватара пользователя
sunjob
Сообщения: 330
Контактная информация:

Re: "break to out" from for/switch

Сообщение sunjob »

да, говорящая рыба... она такая... классный мульт :drinks:
если я ошибаюсь, то поправьте а не критикуйте :о)
Спасибо сказали:
Ответить