С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
#1

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

13.08.2014, 19:29. Просмотров 1620. Ответов 24
Метки нет (Все метки)

Читал что оператор 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 19:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Корректно ли использовать goto? (C++):

Использовать оператор перехода GOTO в приведенном коде - C++
Мне нужен оператор перехода GOTO в программе. Если выводится сообщение &quot;Данное число в массиве отсутствует&quot;, то должно перейти на начало...

При вводе пользователем числа от 0 до 9, вывести на экран название программы (использовать оператор goto) - C++
Программу по заданию я написал Написать программу для выполнения следующих действий. При вводе цифры от 0 до 9 будет выводиться ее...

Как правильно вызвать метод в С++ и как использовать команду goto в default - C++
#include &lt;iostream&gt;; #include &lt;conio.h&gt;; using namespace std; void main() { setlocale(LC_ALL, &quot;Rus&quot;); calculate(); ...

О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? - C++
Вот есть такой оператор всеми программистами нелюбимый. Goto называется. Говорят, что его использование всегда можно обойти и...

Замена goto - C++
Здравствуйте! Имеется следующий код: start: double a; cout &lt;&lt; &quot;\nEnter side of triangle: &quot;; while(!(cin&gt;&gt;a) ||...

Выйти из goto. - C++
Работаю в С++. Было задание написать программу с использованием goto. Вот код: ...

24
Водяной Змей
Заблокирован
14.08.2014, 03:31 #16
ValeryS,
а то что структурность программы теряется, это так мелочи
вернемся опять к "спагети"
Структурность программы зависит больше от IDE, чем от применённых в ней парадигм.
В Visual Studio на C# можно такой код написать, что вроде бы и "спагетти" его называть некорректно, а читается хуже, чем иное древнее спагетти до-ООП-овской эпохи.
Например, стандартов, в каком порядке размещать переменные, константы, обработчики событий и прочие члены классов, нет вообще никаких. Или есть, но никто им не следует. И IDE не обеспечивают автоматически соблюдение таких стандартов, хотя могли бы. (В подобном духе пытались сделать Eclipse, в частности в реализации под Android, но вышло глючно, сыро, да еще и медлительно ибо Java.)

ИМХО, сейчас можно написать IDE, которая обеспечит достаточную структурность и читабельность и чисто императивному коду, так что получится лучше, чем в имеющихся ныне IDE для ЯП с ООП.
Другое дело, что как раз это - не нужно. Сил придется вложить в такую IDE много, при этом толкового все равно не выйдет: IDE будет кушать адову тонну ресурсов, часто глючить, и на неё будет сложно перейти с нынешних IDE.
Но вот способ структурировать код на C# для ООП в нынешних IDE не помешал бы.
Тем более большие проблемы со структурностью кода на Си под WinAPI - goto нет, а спагетти/просто плохо читаемый код все равно есть.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
14.08.2014, 08:37 #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 только один прыжок - сразу на следующий байткод. Минус один прыжок для обработки каждого байткода - это большая оптимизация.
4
gru74ik
Эксперт CЭксперт С++
4207 / 1853 / 198
Регистрация: 20.02.2013
Сообщений: 4,992
Записей в блоге: 22
14.08.2014, 09:49 #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.
1
krv
74 / 54 / 11
Регистрация: 10.07.2014
Сообщений: 328
14.08.2014, 10:43 #19
Вопрос "использовать или не использовать goto" это вопрос холивара
Вообще я его изредка использую...
посидел, подумал.. насчитал 3-4 использования за последние пару лет.
нда. :/
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
15.08.2014, 01:00 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
а то что структурность программы теряется
1. Структурность программы теряется только там, где goto использован неграмотно.
2. Структурность теряется и при использовании неправильно обычных операторов. Предлагаю убрать все операторы вообще. Будет структурированная пустая программа.
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
15.08.2014, 05:47 #21

Не по теме:

Gwini, ты что, боишься, что тебя злые дядьки заругают?



goto незаменим при правке собственных программ, когда к ним возвращаешься после некоторого времени или при правке чужого кода. Неохота разбираться с чужими фигурными скобками или вспоминать свои, используешь goto.
1
Gwini
10 / 10 / 3
Регистрация: 08.03.2014
Сообщений: 70
15.08.2014, 07:22  [ТС] #22
Цитата Сообщение от kravam Посмотреть сообщение
Gwini, ты что, боишься, что тебя злые дядьки заругают?
именно
0
krv
74 / 54 / 11
Регистрация: 10.07.2014
Сообщений: 328
15.08.2014, 11:36 #23
Цитата Сообщение от kravam Посмотреть сообщение
Неохота разбираться с чужими фигурными скобками или вспоминать свои, используешь goto.
А потом такие костыли вылазят....
В принципе, самый распространённый вариант goto - выход из многократно вложенного цикла.
Да и то такая ситуация чаще решается выносом такого цикла в функцию и использованием return - ибо опять же чаще всего это получается отдельный логический кусочек программы.
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
15.08.2014, 12:03 #24
Цитата Сообщение от krv Посмотреть сообщение
А потом такие костыли вылазят....
Это жизнь. В чём-то выигрываем, в чём-то проигрываем.
0
SatanaXIII
15.08.2014, 15:03     Корректно ли использовать goto?
  #25
 Комментарий модератора 
Конкретно про код тс никто не вспомнил и как обычно просто потрясли гортанями.

Закрыто.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 15:03
Привет! Вот еще темы с ответами:

Избавиться от goto. - C++
Нашла в интернете одну очень интересную реализацию меню, но там есть goto. по идее от него можно избавиться применением циклов, но у меня...

Ненависть к Goto - C++
Почему к Goto такая ненависть ? Я считаю, что goto универсальный оператор, благодаря которому можно отказаться от всяких While и For. ...

Альтернатива goto в С++ - C++
Как перейти из конца цикла (перенаправление - first) в самое начало программы, дело в том, что goto нельзя перенаправлять в начало...

Аналог goto - C++
Подскажите ,есть ли в С++ аналог оператора goto? Есть код: int main() { setlocale(0, &quot;&quot;); //поддержка русского языка int...


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

Или воспользуйтесь поиском по форуму:
25
15.08.2014, 15:03
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.