Russian Qt Forum

Программирование => С/C++ => Тема начата: Nastya от Апрель 19, 2004, 17:16



Название: оператор goto
Отправлено: Nastya от Апрель 19, 2004, 17:16
кто мне внятно объяснит почему считается плохим тоном использование в программе оператора goto ???


Название: Re: оператор goto
Отправлено: Rainbow от Апрель 19, 2004, 18:42
Элементарно, Настя: представте себе функцию с хотя-бы 5-ма такими операторами. Уже начиаеш ходить вокруг да около. К тому, же без него можно элементарно обойтись.


Название: оператор goto
Отправлено: npak от Апрель 19, 2004, 18:50
Это не совсем правда.

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

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

Я несколько раз сам пользовался goto (за три прошедших года -- раз десять), и видел у хороших людей.


Название: оператор goto
Отправлено: simeon от Апрель 20, 2004, 11:23
Обычно рекомедуют пользоваться goto только для выхода из вложеных циклов. Только тогда его применение оправдано, так как без него придется извращаться.
Во всех остальных случаях "иди ты на" не элегантен и может быть заменет на что либо более приемлемое.


Название: оператор goto
Отправлено: xaos от Апрель 20, 2004, 12:14
Единствений раз когда я использовал goto - так ето при програмировании на ассемблере,  а так даже никогда не испитивал в нем необходимости


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

У уже 8-й год пишу на С/С++ и еще ни разу не написал ни одной строчки с goto. Следуя из этого: если програму нормально спрэктировать, тогда такх вопрос не должно быть, а про goto можно забыть.


Название: оператор goto
Отправлено: npak от Апрель 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;
}


В С++ так изголяться не надо, так как деструкторы автоматически вызываются при выходе из функции.


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


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

Теперь насчет кода.  Вот ты привел элемеентарную функци. Да, в этом случае с goto все проще. Но когда ф-я длинная, строк скажем 50, то как дальше? Тогда будем искать, куда же этот чертов оператор ссылается?


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

К специализированным вариантам goto надо бы ещё добавить if-else, а также do-while, while, for, по крайней мере, циклы с всегда истинным условием... Остались в Си ещё какие-нибудь операторы передачи управления, не являющиеся специализированными вариантами goto?


Название: оператор goto
Отправлено: npak от Апрель 21, 2004, 14:47
вызов функции/return

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


Название: goto
Отправлено: Alex00 от Апрель 29, 2004, 13:21
Цитата: "npak"
вызов функции/return

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


Хе-хе! Про switch я забыл! А вот вызов ф-ии и возврат это всё-таки не goto (call & ret != jmp). В внутрисегментном goto (а в Си, кажется, только такой и возможен) не сохраняются cs/eip/flags, а при вызове функций - всегда!


Название: оператор goto
Отправлено: NikZ от Июнь 10, 2004, 18:17
В C, а уж тем более в C++ без инструкции goto можно обойтись практически всегда... структурированные языки на то и структурированные - чтобы использовать не структуры, а не превращать программу в "спагетти" (c). Вы попробуйте написать программу хотя бы мало-мальски большую программу с многократным использованием goto - и Вы сами в ней же запутаетесь :)