Форум программистов, компьютерный форум CyberForum.ru

Корректно ли использовать goto? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
13.08.2014, 19:29     Корректно ли использовать goto? #1
Читал что оператор goto вообще советуют не использовать, кроме разве что глубоких циклов. Но нормально ли это будет, например, вот в таком коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    char choice;
    cin >> choice;
    while (cin.get() != '\n')
    {
        cin.ignore(100, '\n');
        bad:cout << "Bad choice. Try again.\n";
        cin >> choice;
        continue;
    }
    switch (choice)
    {
    case 'a': cout << "A";
            break;
    case 'b':cout << "B";
    default: goto bad;
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 19:29     Корректно ли использовать goto?
Посмотрите здесь:

Выйти из goto. C++
C++ goto?
Как правильно вызвать метод в С++ и как использовать команду goto в default C++
Альтернатива goto в С++ C++
C++ Аналог goto
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.08.2014, 19:45     Корректно ли использовать goto? #2
Gwini, нет не нормально в любой вариации, забудьте об этом опреаторе.
Всё прекрасно решается без готу посредством циклов. О коде поста говорить вообще не хочется, прсото напишу он плох.
Водяной Змей
Заблокирован
13.08.2014, 19:49     Корректно ли использовать goto? #3
А зачем тут именно goto? Почему нельзя сделать функцию bad()?
Может есть алгоритмы, которые кому-то кажутся более понятными с goto. Но здесь-то он что дает?
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
13.08.2014, 19:53  [ТС]     Корректно ли использовать goto? #4
Цитата Сообщение от Водяной Змей Посмотреть сообщение
А зачем тут именно goto? Почему нельзя сделать функцию bad()?
я просто спросил нельзя ли его использовать в подобных ситуациях. Понятно что можно сделать по-другому, но это мне показалось удобным вот я и спросил.
Водяной Змей
Заблокирован
13.08.2014, 19:54     Корректно ли использовать goto? #5
нельзя ли его использовать в подобных ситуациях
Ну если ваш код никто не увидит, кроме вас, или тех, кто определенно считает подобные вещи удобными, - используйте.
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
13.08.2014, 19:57  [ТС]     Корректно ли использовать goto? #6
Понятно
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
13.08.2014, 20:10     Корректно ли использовать goto? #7
Цитата Сообщение от Gwini Посмотреть сообщение
вообще советуют не использовать, кроме разве что глубоких циклов.
Должна быть четкая аргументация чем оправдано использование go to, чаще всего такой аргументации нет ибо можно успешно использовать другие конструкции.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
13.08.2014, 21:15     Корректно ли использовать goto? #8
Не использовать goto - это очень правильно.
В крайнем случае - можете использовать для перехода вперед по коду программы,
но не назад и, тем. более, внутрь цикла, как в Вашем примере!
Водяной Змей
Заблокирован
13.08.2014, 21:36     Корректно ли использовать goto? #9
zss, +
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
13.08.2014, 21:39     Корректно ли использовать goto? #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
нет не нормально в любой вариации, забудьте об этом опреаторе.
Нет, нормально в некоторых вариациях. Пусть автор помнит о нем и применяет, где считает необходимым.
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,419
13.08.2014, 21:52     Корректно ли использовать goto? #11
Цитата Сообщение от Gwini Посмотреть сообщение
Читал что оператор goto вообще советуют не использовать, кроме разве что глубоких циклов. Но нормально ли это будет, например, вот в таком коде:
Да, советуют. Однако я сам недавно смотерл исзодники какого-то класса в Java. И там видел использование этого оператора.

Добавлено через 1 минуту
ААА, это был класс с датой, там был парсик строки.
-=ЮрА=-
Заблокирован
Автор FAQ
13.08.2014, 21:53     Корректно ли использовать goto? #12
Vourhey,честно не могу представить ни одного варианта где готу нельзя заменить условием либо континьюе в цикле. Максимум - выйти вконец какого-то полотна из кода но опять же кто мешает сделать там ритерн или накинуть условие.
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,419
13.08.2014, 21:53     Корректно ли использовать goto? #13
Да, это класс Date.java
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
14.08.2014, 02:30     Корректно ли использовать goto? #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Vourhey,честно не могу представить ни одного варианта где готу нельзя заменить условием либо континьюе в цикле
Заменить можно. Только зачем?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Максимум - выйти вконец какого-то полотна из кода но опять же кто мешает сделать там ритерн или накинуть условие.
Никто не мешает. Но зачем плодить условия, если где-то удобнее, можно написать через goto?
Причин убегать от goto кроме личной неприязни никакой нет.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
14.08.2014, 03:05     Корректно ли использовать goto? #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Vourhey,честно не могу представить ни одного варианта где готу нельзя заменить условием либо континьюе в цикле.
в микроконтроллерах например вернутся на точку старта
Цитата Сообщение от Vourhey Посмотреть сообщение
Причин убегать от goto кроме личной неприязни никакой нет.
а то что структурность программы теряется, это так мелочи
вернемся опять к "спагети"
Водяной Змей
Заблокирован
14.08.2014, 03:31     Корректно ли использовать goto? #16
ValeryS,
а то что структурность программы теряется, это так мелочи
вернемся опять к "спагети"
Структурность программы зависит больше от IDE, чем от применённых в ней парадигм.
В Visual Studio на C# можно такой код написать, что вроде бы и "спагетти" его называть некорректно, а читается хуже, чем иное древнее спагетти до-ООП-овской эпохи.
Например, стандартов, в каком порядке размещать переменные, константы, обработчики событий и прочие члены классов, нет вообще никаких. Или есть, но никто им не следует. И IDE не обеспечивают автоматически соблюдение таких стандартов, хотя могли бы. (В подобном духе пытались сделать Eclipse, в частности в реализации под Android, но вышло глючно, сыро, да еще и медлительно ибо Java.)

ИМХО, сейчас можно написать IDE, которая обеспечит достаточную структурность и читабельность и чисто императивному коду, так что получится лучше, чем в имеющихся ныне IDE для ЯП с ООП.
Другое дело, что как раз это - не нужно. Сил придется вложить в такую IDE много, при этом толкового все равно не выйдет: IDE будет кушать адову тонну ресурсов, часто глючить, и на неё будет сложно перейти с нынешних IDE.
Но вот способ структурировать код на C# для ООП в нынешних IDE не помешал бы.
Тем более большие проблемы со структурностью кода на Си под WinAPI - goto нет, а спагетти/просто плохо читаемый код все равно есть.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.08.2014, 08:37     Корректно ли использовать goto? #17
goto иногда бывает очень полезным. Например в OpenJDK интерпретатор построен на goto (если используется gcc). В gcc есть фича взятия адреса метки и обработка байткода там построена так

C++
1
2
3
iload_0: // iload_0 это java байткод
    // какой-то код
    goto next_bytecode;
а если используется не gcc, то логика построена так
C++
1
2
3
4
5
6
7
8
9
10
11
while(true) {
    switch (bytecode) {
    case iload_0:
        // ...
        break;
    case iload_1:
        // ...
        break;
    //etc
    }
}
Т.е. без goto для обработки одного байткода делается 2 прыжка - по switch'у в нужный case и потом из case'а в начало switch'а. А с goto только один прыжок - сразу на следующий байткод. Минус один прыжок для обработки каждого байткода - это большая оптимизация.
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
14.08.2014, 09:49     Корректно ли использовать goto? #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
не нормально в любой вариации, забудьте об этом опреаторе
Страуструп считает иначе:
Цитата Сообщение от Бьярне Страуструп
"Язык Программирования С++" (2011, специальное издание):

6.3.4. Оператор goto
Оператор goto полезен в ряде случаев и в обычном высокоуровневом
программировании, но он особо полезен, когда программу создает не человек, а другая
программа: например, при автоматической генерации парсера на базе формальной
грамматики. Также goto полезен для программ реального времени, когда нужно
с высокой эффективностью реализовать выход из внутреннего цикла.
Причём, он не изменил своей позиции и по сию пору:
Цитата Сообщение от Bjarne Stroustrup
The C++ Programming Language (2013, Fourth Edition):

9.6 goto Statements
C++ possesses the infamous goto:

goto identifier ;
identifier : statement

The goto has few uses in general high-level programming, but it can be very useful when C++ code
is generated by a program rather than written directly by a person; for example, gotos can be used
in a parser generated from a grammar by a parser generator.
The scope of a label is the function it is in (§6.3.4). This implies that you can use goto to jump
both into and out of blocks. The only restriction is that you cannot jump past an initializer or into
an exception handler (§13.5).
One of the few sensible uses of goto in ordinary code is to break out from a nested loop or
switch -statement (a break breaks out of only the innermost enclosing loop or switch -statement). For
example:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void do_something(int i, int j)
    // do something to a two-dimensional matrix called mn
{
    for (i = 0; i!=n; ++i)
        for (j = 0; j!=m; ++j)
            if (nm[i][j] == a)
                goto found;
    // not found
    // ...
found:
    // nm[i][j] == a
}
Note that this goto just jumps forward to exit its loop. It does not introduce a new loop or enter a
new scope. That makes it the least troublesome and least confusing use of a goto.
krv
71 / 51 / 11
Регистрация: 10.07.2014
Сообщений: 328
14.08.2014, 10:43     Корректно ли использовать goto? #19
Вопрос "использовать или не использовать goto" это вопрос холивара
Вообще я его изредка использую...
посидел, подумал.. насчитал 3-4 использования за последние пару лет.
нда. :/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 01:00     Корректно ли использовать goto?
Еще ссылки по теме:

C++ Ненависть к Goto
C++ Goto
C++ Использовать оператор перехода GOTO в приведенном коде

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
15.08.2014, 01:00     Корректно ли использовать goto? #20
Цитата Сообщение от ValeryS Посмотреть сообщение
а то что структурность программы теряется
1. Структурность программы теряется только там, где goto использован неграмотно.
2. Структурность теряется и при использовании неправильно обычных операторов. Предлагаю убрать все операторы вообще. Будет структурированная пустая программа.
Yandex
Объявления
15.08.2014, 01:00     Корректно ли использовать goto?
Закрытая тема Создать тему
Опции темы

Текущее время: 03:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru