Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
По goto за конец цикла и не страдать.
Ещё можно вложенные циклы в отдельный метод завернуть и выходить из него по return. Некоторым иногда кажется, что так лучше.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
On 13.10.2010 16:55, XJess wrote:
Как Вы бы вышли сразу из нескольких > циклов? Мне приходят в голову два варианта — с помощью опять же goto или > флагами.
Здравствуйте, los puercos, Вы писали:
LP>>>3) использовать goto и быстро выпить йаду B>>А вас switch не смущает? LP>Смущает, очень. Краснею, смущаюсь и использую что-нибудь типа Visitor или Command
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
1. Сохранить текущее состояние в файл.
2. Перезагрузить компьютер.
3. Запустить программу при загрузке ОС.
4. Восстановить состояние из сохраненного файла.
Здравствуйте, blackhearted, Вы писали:
B>ПГМ ? B>PS П == паттернизм.
По-русски это называется "шаблонное мышление"
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, IROV.., Вы писали: IRO>да я гдето видел написаный на ООП "Hello World" IRO>не кажеться что всему свое место? и не стоит все под одно "чисать"
А что внем такого ужасного увиде Или утя какойто неправильный хелловорд был
class CMyApp : public CApp
{
public:
virtual int Run()
{
console.print("Hello World");
return 0
};
};
Здравствуйте, March_rabbit, Вы писали:
M_>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.
А почему не сделать так:
int длинный_и_тупой_алгоритм() {
тупые_вычисления_1();
if (шит_хаппен) goto приехали;
тупые_вычисления_2();
if (шит_хаппен) goto приехали;
тупые_вычисления_3();
if (шит_хаппен) goto приехали;
тупые_вычисления_4();
if (шит_хаппен) goto приехали;
тупые_вычисления_5();
if (шит_хаппен) goto приехали;
усё_в_упорядке();
приехали:
return 0;
}
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, March_rabbit, Вы писали:
B>>>О, мьсе понимает толк в извращениях! M_>>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.
E>
1. убрать скобки за тупыми действиями, а то return никуда не выйдет
2. убрать метод "Спасибо_ничего_не_надо" и перенести его контент в деструктор класса ПараВействийПередВыходомДелатель (чтобы само делалось)
3. часть логики выпадает из места, где она имеет какой-то смысл.
4. трудности с локальными переменными
Здравствуйте, los puercos, Вы писали:
LP>>>3) использовать goto и быстро выпить йаду B>>А вас switch не смущает? LP>Смущает, очень. Краснею, смущаюсь и использую что-нибудь типа Visitor или Command
Господа, у вас плохо с ч/ю. Кто не понял — это был такой толстый сарказм.
switch — это прекрасно, пока их не становится 2, 3 и так далее для обработки одной и той же последовательности кейсов.
А вот goto must die
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, blackhearted, Вы писали:
B>>ПГМ ? B>>PS П == паттернизм.
E>По-русски это называется "шаблонное мышление"
А кто сказал, что "шаблонное мышление" — это плохо?
Хинт: стремление применять шаблоны там где можно и нельзя шаблонным мышлением не является.
Здравствуйте, March_rabbit, Вы писали:
M_>2. убрать метод "Спасибо_ничего_не_надо" и перенести его контент в деструктор класса ПараВействийПередВыходомДелатель (чтобы само делалось)
Я так понимаю, что Спасибо_ничего_не_надо — это как раз сигнал того, что в деструкторе ничего не надо делать. Т.е. в случае ошибки и return-а из середины функции деструктор как раз все что нужно сделать при ошибке сделает, а в случае успешного выхода эти дейсвия не нужны и Спасибо_ничего_не_надо просто выставляет соответсвующий флаг.
Здравствуйте, Vain.
Вы писали:
V>Месье знает как писать без вложенных циклов?
Что-то не припомню, когда в последний раз мне понадобилась конструкция с вложенными циклами.
Один в другом — бывает иногда, но все равно редко. И выход из них обычно с помощью return.
Но Вы не забывайте — тема про извращения.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, okman, Вы писали:
O>>Что-то не припомню, когда в последний раз мне понадобилась конструкция с вложенными циклами. O>>Один в другом — бывает иногда, но все равно редко. И выход из них обычно с помощью return.
E>От задач очень зависит...
Зависит и от инструментов.
"Плюсы" как бы не располагают к многократно вложенным друг в друга конструкциям, то есть
волей-неволей, а все равно стараешься выражать код как бы потоком, сверху-вниз.
Если бы я постоянно сталкивался с необходимостью выходить из вложенных циклов, я бы
задумался о правильности выбора языка для решения своих задач.
На первый раз можно goto или даже throw обойтись (с пониманием того что делаешь и к чему это приведет).
Ну а дальше — или пересаживаться на ассемблер, где jmp не так порицается, как его затравленные
высокоуровневые аналоги, или временно завязать с кодингом и вернуться к чтению классики и перфокартам.
Привет всем!
Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
1) throw
2) оформить логику циклов как отдельную функцию, и выйти по return
3) использовать goto и быстро выпить йаду
Здравствуйте, los puercos, Вы писали:
LP>Здравствуйте, XJess, Вы писали:
XJ>>Привет всем! XJ>>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
LP>1) throw
А тут не пить ядок? LP>2) оформить логику циклов как отдельную функцию, и выйти по return
Тут тоже яду не нужно? LP>3) использовать goto и быстро выпить йаду
А вас switch не смущает?
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, los puercos, Вы писали:
LP>>Здравствуйте, XJess, Вы писали:
XJ>>>Привет всем! XJ>>>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
LP>>1) throw B>А тут не пить ядок?
Разве что немного. Не самое лучшее решение, привел "за компанию"
LP>>2) оформить логику циклов как отдельную функцию, и выйти по return B>Тут тоже яду не нужно?
Нет, тут не нужно. Можно йогурт.
LP>>3) использовать goto и быстро выпить йаду B>А вас switch не смущает?
Смущает, очень. Краснею, смущаюсь и использую что-нибудь типа Visitor или Command
Здравствуйте, Brutalix, Вы писали:
B>Здравствуйте, okman, Вы писали:
O>>Исключения.
B>О, мьсе понимает толк в извращениях!
кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.
Здравствуйте, los puercos, Вы писали:
LP>>>3) использовать goto и быстро выпить йаду B>>А вас switch не смущает? LP>Смущает, очень. Краснею, смущаюсь и использую что-нибудь типа Visitor или Command
да я гдето видел написаный на ООП "Hello World"
не кажеться что всему свое место? и не стоит все под одно "чисать"
Здравствуйте, los puercos, Вы писали:
LP>>>3) использовать goto и быстро выпить йаду B>>А вас switch не смущает? LP>Смущает, очень. Краснею, смущаюсь и использую что-нибудь типа Visitor или Command
а вот не надо делать сложно (и "красиво") там, где можно просто. Такие вот авторы напишут, а потом другому что-нибудь поправить или добавить в код приходится. И начинается: шаблоны, сигналы, мапперы, визиторы, макросы.... вплоть до того, что есть у класса метод, а где объявлен и определен — не найти, ибо за шаблонами и макросами спрятан (это из последнего, но я ранее с таким же сталкивался)....
Здравствуйте, blackhearted, Вы писали:
B>Здравствуйте, los puercos, Вы писали:
LP>>>>3) использовать goto и быстро выпить йаду B>>>А вас switch не смущает? LP>>Смущает, очень. Краснею, смущаюсь и использую что-нибудь типа Visitor или Command
B>ПГМ ? B>PS П == паттернизм.
Здравствуйте, Brutalix, Вы писали:
B>Здравствуйте, March_rabbit, Вы писали:
M_>>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.
B>А почему не сделать так:
B>
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
Заворачивание нескольких циклов в итератор и один цикл с break по этому итератору. Извращенным этот способ делает, пожалуй, только сложность написания своих итераторов и отсутствие лямбд. В C# с LINQ это делается элементарно
Здравствуйте, Brutalix, Вы писали:
B>А почему не сделать так:
B>
B>int длинный_и_тупой_алгоритм() {
B> тупые_вычисления_1();
B> if (шит_хаппен) goto приехали;
B> тупые_вычисления_2();
B> if (шит_хаппен) goto приехали;
B> тупые_вычисления_3();
B> if (шит_хаппен) goto приехали;
B> тупые_вычисления_4();
B> if (шит_хаппен) goto приехали;
B> тупые_вычисления_5();
B> if (шит_хаппен) goto приехали;
B> усё_в_упорядке();
B>приехали:
B> return 0;
B>}
B>
А почему бы "приехали" не сделать функцией? и использовать ее в связке с return?
Хотя, в данном примере даже функция не нужна. вместо goto приехали можно сразу return 0; или добавить переменную int result_code, оставив один return в конце и не забывая проверять ее перед каждым вычислением, — специально для тех кто придерживается идеологии одного return'a. //я не один из них
Вспомнил реальный случай. Студент хотел устроиться на работу, и ему дали несколько простых заданий, среди которых нужно было отсортировать массив. В его сортировке не было ни одного цикла реализованного с помощью for, while, do while (об stl даже не заикаюсь). Он сделал все на goto:
Спасибо ему за хорошее настроение целого отдела!
По теме делаю как говорил Erop "Ещё можно вложенные циклы в отдельный метод завернуть и выходить из него по return".
Сам, если вижу в коде goto начинаю испытывать чувство повышенной предосторожности. ИМХО и не только, "первым и единственным аргументом в пользу GOTO есть то, что другие операторы могут в 99% случаев заменить его с пользой для читабельности и структурированности", поэтому использовать его может и нужно, но только когда без этого уже никак не обойтись. Таких случаев на моей плюсовой практике еще не было. Интересно было бы посмотреть на реальные ситуации, когда без goto, ну уж совсем никак!
Здравствуйте, stapter, Вы писали:
S>А почему бы "приехали" не сделать функцией? и использовать ее в связке с return?
Там может быть какая нибудь хрень, которая, например, делает что либо с чем-нибудь локальным, которое пришлось бы передавать в эту функцию в качестве параметров. Или еще что нить.
Вообще, так можно сделать. Но в некоторых случаях просто галимый идина проще
S>Хотя, в данном примере даже функция не нужна. вместо goto приехали можно сразу return 0; или добавить переменную int result_code, оставив один return в конце и не забывая проверять ее перед каждым вычислением, — специально для тех кто придерживается идеологии одного return'a. //я не один из них
Есть такая бяка, называется, кодинг стандардз. В нем иногда пишут весьма странные вещи. И иногда их пишут как раз идеологи одного ретурна
S>Сам, если вижу в коде goto начинаю испытывать чувство повышенной предосторожности. ИМХО и не только, "первым и единственным аргументом в пользу GOTO есть то, что другие операторы могут в 99% случаев заменить его с пользой для читабельности и структурированности", поэтому использовать его может и нужно, но только когда без этого уже никак не обойтись. Таких случаев на моей плюсовой практике еще не было. Интересно было бы посмотреть на реальные ситуации, когда без goto, ну уж совсем никак!
По теме. я б осетра уменьшил и свечи потушил сказал — в 80% без идина можно пережить. еще в 10% можно изящно извратиться и обойтись без него. Но в 10% случаев с ним проще
Здравствуйте, Brutalix, Вы писали:
B>Там может быть какая нибудь хрень, которая, например, делает что либо с чем-нибудь локальным, которое пришлось бы передавать в эту функцию в качестве параметров. Или еще что нить. B>Вообще, так можно сделать. Но в некоторых случаях просто галимый идина проще
Можно сделать из функции класс, а локальные переменные сделать его полями...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, March_rabbit, Вы писали:
B>>О, мьсе понимает толк в извращениях! M_>кстати, смех смехом, но разок я именно так и сделал. Не для выхода из циклов, а для реализации длинного и тупого алгоритма, в котором ошибка на каждом шаге приводила к завершению работы процедуры. Просто return не прокатывал, потому как надо было выполнить еще пару действий. Решил не плодить дерева if-ов, а сделать линейный алгоритм с выходом по исключениям.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, trophim, Вы писали:
E>>По goto за конец цикла и не страдать. T>А на сколько при этом будет испорчена карма?
Это зависит от намерений и умений посылающего
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Brutalix, Вы писали:
B>>Там может быть какая нибудь хрень, которая, например, делает что либо с чем-нибудь локальным, которое пришлось бы передавать в эту функцию в качестве параметров. Или еще что нить. B>>Вообще, так можно сделать. Но в некоторых случаях просто галимый идина проще
E>Можно сделать из функции класс, а локальные переменные сделать его полями...
1. Лишние телодвижения (объявление класса, мемберов, конструктора, оператора скобки)
2. Вынос логики наружу из места использования (именно поэтому я предпочитаю использовать макросни типа Q_FOREACH вместо STL, где это возможно).
И все это только для того, чтобы избавиться от goto или лишнего бросания исключения? Стоит ли оно того?
Здравствуйте, March_rabbit, Вы писали:
M_>И все это только для того, чтобы избавиться от goto или лишнего бросания исключения? Стоит ли оно того?
Только ради goto не стоит, конечно. Я вроде бы прямо так и советовал по goto выходить и не страдать.
Но у подхода класс-механизм
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, okman, Вы писали:
B>>О, мьсе понимает толк в извращениях! O>Извращение — писать большущие конструкции с вложенными циклами, O>а потом думать как из них вылезти.
Месье знает как писать без вложенных циклов?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, XJess, Вы писали:
XJ>Привет всем! XJ>Собственно, сабж. Читала книгу по C# и там описание оператора goto. И вдруг всплыл этот наболевший вопрос в голове. Как Вы бы вышли сразу из нескольких циклов? Мне приходят в голову два варианта — с помощью опять же goto или флагами. И то, и другое некрасиво вроде... Может, еще есть какие извращенные способы, которые кто-то придумал?
Вброшу и свои заготовки: http://codepad.org/zzGcnfwg
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, uzhas, Вы писали:
V>>Это к чему? U>это к тому, что подобные фишки могут быть в самом языке, а не на костылях
Могут, но нету, пока что. А кушать хочется каждый день
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, okman, Вы писали:
O>Что-то не припомню, когда в последний раз мне понадобилась конструкция с вложенными циклами. O>Один в другом — бывает иногда, но все равно редко. И выход из них обычно с помощью return.
От задач очень зависит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, okman, Вы писали:
O>На первый раз можно goto или даже throw обойтись (с пониманием того что делаешь и к чему это приведет). O>Ну а дальше — или пересаживаться на ассемблер, где jmp не так порицается, как его затравленные O>высокоуровневые аналоги, или временно завязать с кодингом и вернуться к чтению классики и перфокартам.
IMHO, это глупо -- пересаживаться с С на асм только из-за предубеждений против goto в С...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>IMHO, это глупо -- пересаживаться с С на асм только из-за предубеждений против goto в С...
Интересно, а глупо ли обратное ?
Я, например, пересел с ассемблера сначала на C, а потом на C++ в основном по одной причине —
в низкоуровневых языках очень мало автоматических средств, гарантирующих корректность кода.
Например, нет деструкторов (не представляю, как можно жить без RAII), нет проверок типов (очень
часто оставлял DWORD вместо PDWORD и "прокатывало"), нет средств структурирования кода и
отделения логики от интерфейса. А потребность в таких средствах была сильнейшая, доходило до
того, что я чуть не сел за написание "ассемблера с классами", благо про C/C++ узнал.
Ну а если человек испытывает с C/С++ постоянные неудобства — то он return-ом не может вернуться в
"позапрошлую" функцию, то из восьми вложенных циклов не может нормально вылезти, — ему самое
место в индустрии низкоуровневых языков. Разве нет ?
Здравствуйте, okman, Вы писали:
O>"позапрошлую" функцию, то из восьми вложенных циклов не может нормально вылезти, — ему самое O>место в индустрии низкоуровневых языков. Разве нет ?
Нет. Так как ему место не в индустрии, а там, где учат писать ПОНЯТНЫЙ код...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском