Russian Qt Forum
Ноябрь 23, 2024, 03:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: оператор goto  (Прочитано 11063 раз)
Nastya
Гость
« : Апрель 19, 2004, 17:16 »

кто мне внятно объяснит почему считается плохим тоном использование в программе оператора goto Непонимающий
Записан
Rainbow
Гость
« Ответ #1 : Апрель 19, 2004, 18:42 »

Элементарно, Настя: представте себе функцию с хотя-бы 5-ма такими операторами. Уже начиаеш ходить вокруг да около. К тому, же без него можно элементарно обойтись.
Записан
npak
Гость
« Ответ #2 : Апрель 19, 2004, 18:50 »

Это не совсем правда.

Скорее, так стращают начинающих программистов.  Неоднократно наблюдал, как при безудержном применении goto программа безнадёжно запутывается.

Действительно стоит некоторое время обходиться без goto.  Вернее, пользоваться специализированными вариантами goto -- break, continue (в C/C++).  Наберётся опыт, и станет (возможно) ясно, что goto пользоваться можно, но очень-очень редко.

Я несколько раз сам пользовался goto (за три прошедших года -- раз десять), и видел у хороших людей.
Записан
simeon
Гость
« Ответ #3 : Апрель 20, 2004, 11:23 »

Обычно рекомедуют пользоваться goto только для выхода из вложеных циклов. Только тогда его применение оправдано, так как без него придется извращаться.
Во всех остальных случаях "иди ты на" не элегантен и может быть заменет на что либо более приемлемое.
Записан
xaos
Гость
« Ответ #4 : Апрель 20, 2004, 12:14 »

Единствений раз когда я использовал goto - так ето при програмировании на ассемблере,  а так даже никогда не испитивал в нем необходимости
Записан
Rainbow
Гость
« Ответ #5 : Апрель 20, 2004, 12:41 »

Цитата: "simeon"
Обычно рекомедуют пользоваться goto только для выхода из вложеных циклов.

У уже 8-й год пишу на С/С++ и еще ни разу не написал ни одной строчки с goto. Следуя из этого: если програму нормально спрэктировать, тогда такх вопрос не должно быть, а про goto можно забыть.
Записан
npak
Гость
« Ответ #6 : Апрель 20, 2004, 15:31 »

Э-э-э, goto в нормальных процедурных языках используется внутри процедуры.  Так что замечание насчёт спроектированной программы -- это сильновато.  Правильно спроектированная процедура/функция, скорее так.

Есть вариант для межпроцедурных переходов (longjmp) , но это не для слабых духом.  Лично я ни разу не решился им воспользоваться.

Есть один случай использования goto в C (но не в C++), когда в одной процедуре затребываются ресурсы, которые должны быть особождены к окончанию процедуры.
Код:
int f()
{
    alloc_resources();
    // operations
    if (error) { release_resources(); return error_code; }
    // operations
    release_resources();
    return 0;
}


Если в ходе выполнения operations обнаруживается ошибка, то надо завершить работу и вернуть ненулевой код ошибки.  В том случае, когда таких мест несколько, то нужно в каждом месте освобождать ресурс.  Иногда удобнее переписать так:
Код:
int f()
{
    int status = 0;
    alloc_resources();
    // operations
    if (error) { status = error_code; goto cleanup; }
    // operations
  cleanup:
    release_resources();
    return status;
}


В С++ так изголяться не надо, так как деструкторы автоматически вызываются при выходе из функции.
Записан
Rainbow
Гость
« Ответ #7 : Апрель 20, 2004, 17:58 »

Цитата: "npak"
Так что замечание насчёт спроектированной программы -- это сильновато.  Правильно спроектированная процедура/функция, скорее так.


З одной стороны это так, если речь идет об одной функции то это утверждение будет правильно. Но как правило речь идет не об одной функциия, а тысячи.. Так для этого случая высказывание насчет правильно спреэктированой програмы будет уместным.

Теперь насчет кода.  Вот ты привел элемеентарную функци. Да, в этом случае с goto все проще. Но когда ф-я длинная, строк скажем 50, то как дальше? Тогда будем искать, куда же этот чертов оператор ссылается?
Записан
Alex
Гость
« Ответ #8 : Апрель 21, 2004, 06:02 »

Цитата: "npak"
...Вернее, пользоваться специализированными вариантами goto -- break, continue (в C/C++)...

К специализированным вариантам goto надо бы ещё добавить if-else, а также do-while, while, for, по крайней мере, циклы с всегда истинным условием... Остались в Си ещё какие-нибудь операторы передачи управления, не являющиеся специализированными вариантами goto?
Записан
npak
Гость
« Ответ #9 : Апрель 21, 2004, 14:47 »

вызов функции/return

switch -- переход на метку case/default
Записан
Alex00
Гость
« Ответ #10 : Апрель 29, 2004, 13:21 »

Цитата: "npak"
вызов функции/return

switch -- переход на метку case/default


Хе-хе! Про switch я забыл! А вот вызов ф-ии и возврат это всё-таки не goto (call & ret != jmp). В внутрисегментном goto (а в Си, кажется, только такой и возможен) не сохраняются cs/eip/flags, а при вызове функций - всегда!
Записан
NikZ
Гость
« Ответ #11 : Июнь 10, 2004, 18:17 »

В C, а уж тем более в C++ без инструкции goto можно обойтись практически всегда... структурированные языки на то и структурированные - чтобы использовать не структуры, а не превращать программу в "спагетти" (c). Вы попробуйте написать программу хотя бы мало-мальски большую программу с многократным использованием goto - и Вы сами в ней же запутаетесь Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 21.