Обсуждение:Goto

message: Как бы уточнить, оператор GOTO "противен" из-за самого написания или из-за выполняемой операции (команды)?
replies: text: Естественно из-за выполняемой операции. В информатике не преследуются операторы по именному признаку:) Хацкер 08:42, 8 мая 2007 (UTC)
thread_title: Untitled

message: По-моему аргументация в этом разделе надуманна. Насколько я знаю, первым и единственным аргументом в пользу GOTO есть то, что другие операторы могут в 99 процентах случаев заменить его с пользой для читабельности и структурированности, поэтому использовать его все же нужно, но только когда без этого уже никак не обойтись. Если уважаемый автор все же настаивает на своей версии, надеюсь его не затруднит привести ссылки на авторитетные источники. Хацкер 08:40, 8 мая 2007 (UTC)
replies: text: Детский лепет по 99% случаев. --Evgen2 15:03, 18 мая 2007 (UTC)
replies: text: : Вот это и все ваши аргументы? На самом деле доказанно, что GOTO - это избыточная конструкция, и без неё можно обойтись на все 100%. Вот только бывают действительно редкие, очень редкие случаи, когда устранение GOTO действительно ухудшает код. Я сказал один процент к примеру, но в любом случае понятно, что число таких ситуаций крайне мало. Хацкер 17:34, 18 мая 2007 (UTC)
replies: text: ::На самом деле доказанно - это детский лепет в стиле "научно доказано, что это крем сокращает морщины на 39.5%". То, что без чего-то можно обойтись, не означает что этим не нужно пользоваться. Научно доказано, что человек может обойтись без интернета, компьютеров, электричества и прочих благ цивилизации, но это вовсе не означает. что этими благами нельзя пользоваться. В вашей практике - это редкие случаи, но это вовсе не значит, что в чьей-то другой практике такие случаи редки. В случае ассемблера goto в виде jumpов используется сплошь и рядом. Что касается "чистого Си" - навскидку: библиотеки zlib, gdlib, jfs, mesa - кругом конструкции в стиле if(условие) goto cleanup; --Evgen2 21:29, 18 мая 2007 (UTC)
replies: text: ::: Вы так подробно разобрали первую фразу, хотя основной была вторая, её смысл: GOTO должен использоваться в самых крайних случаях, если это абсолютно необходимо, и таких случаев крайне мало. Вы с этим не согласны? В джаве например goto вообще запрещен. Пример с ассемблером не вполне уместен, т.к. когда пишут о goto всегда автоматически подразумевают, что речь идет о структурном программировании. Относительно C рискну предположить, что упомянутые Вами случаи как раз попадают в класс редко используемых. Имеется в виду конечно, что не самих экземпляров goto в коде мало, а мало общих схем его использования. Хацкер 22:33, 18 мая 2007 (UTC)
replies: text: ::::Я плохо понимаю, что такое структурное или что такое функциональное программирование :-) . На том же ассемблере, который макроассемблер вполне можно структурно и функционально программировать. Выражение " В джаве goto вообще запрещен" я тоже не понимаю. Нет его там. Вот в том числе поэтому на жабе не пишут драйвера и программы для DSP-контроллеров. Относительно С еще раз повторю - все зависит от проекта и программистов. Есть проекты, где (иногда по религиозным причинам) goto не используется, есть где используется. --Evgen2 06:42, 19 мая 2007 (UTC)
replies: text: :::::Плохо разбираешься - не раздувай спор, лишь бы что сказать, а для начала разберись. По данному вопросу могу сказать: функц. и структ. пр-ние - стили. Их можно использовать с любым языком. Но на не предназначенных для этого языках это делать неудобно. Goto критикуется и убирается только затем, что он создает соблазн нарушать эти стили в языках, содержащих встроенные средства их применения, но допускающих и неприменение, и, как следствие, является потенциальным источником логических ошибок. Если хочешь подробнее, а также про Джаву и иже с ней, давай в аську - не хочу тут мусорить. — Vano 09:02, 19 мая 2007 (UTC)
replies: text: ::::::Если я сказал, что разбираюсь плохо - это не значит, что я не разбираюсь. Тем более - был поставлен смайл. Goto критикуется в основном из-за религиозных соображений. Потенциальных источников логических ошибок с операторами if, for, do и т.п. ничуть не меньше. --Evgen2 09:51, 19 мая 2007 (UTC)
replies: text: :::::::Раз так говоришь, значит, точно не разбираешься. Именно что меньше. — Vano 21:13, 19 мая 2007 (UTC)
replies: text: ::::::::"Раз так говоришь, значит, точно не разбираешься." Например:
main()
{
  int i;
  double p = 1;
  for(i=2;i<=10;i++);
  {
    p = p * i;
  }
  printf("factorial 10 =%g\n", p);
}
--Evgen2 21:44, 19 мая 2007 (UTC)

text: ::::::::Дальше здесь спорить(читай: мусорить) не вижу смысла. Если охота поболтать на эту тему, давай в аську. — Vano 22:11, 19 мая 2007 (UTC)

text: :::Придираться к формулировкам, тем более в обсуждении - это буквоедство и оффтоп. Вместо этого можно ВЕЖЛИВО попросить собеседника обосновать заявление, кажущееся тебе необоснованным. — Vano 08:34, 19 мая 2007 (UTC)

text: Согласен; фраза про "незаслуженно забыли" - явно орисс.

text: Кроме того, я не видел ни одного редактора, проставляющего метки строк (и тем более отслеживающего их в командах goto). Пример не помешает. — Vano 14:39, 18 мая 2007 (UTC)
replies: text: :откройте для себя бейсик наконец ;-) --Evgen2 15:03, 18 мая 2007 (UTC)
replies: text: ::Чем ехидничать, лучше бы пример редактора привел, раз ты такой опытный. — Vano 17:39, 18 мая 2007 (UTC)
replies: text: :::Откройте для себя edit в MS DOS'е, который одновременно qbasic; как оно называлось в Правец-8/Apple-II я уже не помню. Ээээ... qbasic не отлеживает вставку строк, да и метки там могут быть символическими и даже вот так будет работать:
10 I = 2
11 P = 1
30 P = P * I
9 PRINT "Start"
20 I = I + 1
IF I <= 10 GOTO 30
60 PRINT "factiral 10="; P
или так:
10 I = 2
11 P = 1
M: P = P * I
9 PRINT "Start"
20 I = I + 1
IF I <= 10 GOTO M
60 PRINT "factiral 10="; P
Тогда да...Тот бейсик, который был в "Правцах", точнее - (недо-)редактор имел фишку отслеживать номера строк в GOTO, но она проявлялась только когда добавлялась новая строка с нумерацией по умолчанию --Evgen2 21:29, 18 мая 2007 (UTC)
replies: text: :::::Ну и подсветки синтаксиса понятное дело в те времена не было, да и сами редакторы были системы: втавить/удалить/редактировать строку + прочитать-записать файл.

text: :::Во всем виденных мной редакторах (включая встроенный спектрумовский и QBASIC - специально "заточенные" под Бейсик, - а также Vim - поддерживающий автоформат) номера строк надо было ставить руками. — Vano 18:06, 18 мая 2007 (UTC)

text: : Орисс какой-то.  Абзаца выше (про «иногда допустим»), по-моему, вполне достаточно.  — doublep 14:47, 18 мая 2007 (UTC)
Написал альтернативу - GOTO#Оправданное применение GOTO, где коротко и четко описал случаи и принципы такого применения. Полагаю, что можно ориссный раздел удалить, при необходимости дополнив мой недостающей инфой оттуда (если таковая есть). — Vano 19:17, 18 мая 2007 (UTC)

text: как минимум стоило бы перенести примеры кода с форматированием --Evgen2 21:36, 18 мая 2007 (UTC)
replies: text: :Done. Для второго пункта у меня, помнится, есть пример получше, в лекциях - вставлю, когда (если?) найду. — Vano 01:25, 19 мая 2007 (UTC)

text: :Черт, прочел "привести" вместо "перенести" :). В любом случае, не вижу, куда там можно всунуть имевшиеся примеры кода. Если ты видишь - правь смело. — Vano 01:32, 19 мая 2007 (UTC)
thread_title:  В защиту GOTO 

message: Я случайно забрёл сюда. Первым моим желанием было вставить ссылку на статью Дайекстры (и осознанием того, что сейчас надо будет искать эту самую статью). Втором моим желанием было написать критику этой самой статьи и того, что несмотря на то, что в Яве GOTO не используется, иногда, крайне редко, бывают ситуации, когда такое использование нужно. (В Яве, кстати, для всех таких случаев придуманы решения или break/continiue или try/finally). Третьим желанием, было написать, что оператор GOTO избыточен, но для практических целей иногда нужен, если отсутствую другие решения. Однако, оказалось, что всё это в статье есть.  Alexsmail 20:25, 25 июня 2007 (UTC)
replies: text: Да, в Википедии иногда таки попадаются неплохие статьи;) Хацкер 20:34, 25 июня 2007 (UTC)
replies: text: : Просто часто я уверен, что какая-то конкретная статья написана "неправильно" и нужно её дописать или изменить. Обычно это действительно так. А тут такой облом вышел :-)
Насчёт утверждения Evgen2, что противники применения GOTO иногда носит религиозный смысл, я частично согласен. Мне не раз приходилось слышать, что "Дайекстра формально доказал, что использование GOTO вредно". Пока мне не попалась статья и я её не прочитал и понял, что формально он ничего не доказал, а просто привёл довольно логичные аргументы в пользу своей точки зрения. Вот цитата из приведённого в статье источника:
<blockqoute>
Становится ужасно трудно найти осмысленный набор координат, в которых описывается состояние процесса. Обычно люди принимают во внимание также и значения некоторых избранных переменных, но это не вопрос, потому что состояния процесса зависит, как понимать эти значения! С оператором go to можно, конечно, все еще описывать состояние процесса однозначно при помощи счетчика числа действий, выполненных от старта программы (т.е., некоторой разновидности нормализованных часов). Трудность в том, что такие координаты, хотя они и уникальные, просто бесполезные. С такими координатами система становится чрезвычайно сложной, сталкиваясь с необходимостью определения всех тех точек состояния, в которых, скажем, n равно числу людей в комнате минус один!
</blockqoute>
Я выделил ключевую фразу. С точки зрения "доказательства" Дайекстры всё не так уж плохо. Существуют набор координат, просто он "бесполезен". При чём почему он бесполезен и самое главное формальное определение бесполезности не дано. (Оффтопик, это напоминает состояние в математике в начале XX века, когда были открыты взаимно-однозначный соответствия между отрезком в квадратом, что считалось в то время парадоксом. Долгое время математики отмахивались от этого говоря, что-то типа "это отображение не красиво, не естественно и т.д.)
Единственное формальное доказательство, против GOTO, что этот оператор избыточен, т.е. можно обойтись без него. Сам по себе этот аргумент ничего не доказывает, так как тот же оператор цикла - избыточен, можно использовать рекурсивный вызов функции вместо него. Тем не менее, никто не говорит об отмене оператора цикла.
В конечном итоге использовать или нет GOTO, это дело вкуса (если вы не пишите на Java :-) ). Однако те, кто пишут, должны знать аргументы против него и взвесить использования альтернативных конструкций. Мода на использование GOTO идёт от статьи Дайекстры и насаждение его точки зрения действительно иногда носит религиозный характер. 
Вывод: не нужно впадать в крайности. Попробуйте написать код с GOTO (советую сделать это на Бейсике, при лучше всего на спектрумском варианте, по-моему gwbasic довольно близок к нему, можно использовать и qbasic, хотя можно на любом неструктурированном языке). Если через месяц вы легко сможете прочитать собственный код, а писать комментарии к нему я не запрещаю, используйте GOTO на здоровье. Если нет, старайтесь свести его использование к минимуму, но иногда, всё-таки можно его использовать. Alexsmail 21:04, 25 июня 2007 (UTC)
== Слово против GOTO ==
Различные операторы языков программирования обычно употребляются не потому, что они есть, а потому, что этого требует логика решения задачи. Если следовать концепции структурного программирования, надобность в этом операторе отпадает сама собой. Особенно если не подгонять шаблонные языковые констукции под задачу, а решать задачу с помощью языка программирования.
В частности, приведенный пример в GOTO#Оправданное применение поиска числа в двумерном массиве может быть решен без применения GOTO и его заменителей (вроде break и continue):
int matrix[n][m];
int value;
...
int i=0,j=0;
while(i<n && matrix[i][j]!=value)
  if(j<m-1)
    j++;
  else{
    i++; j=0;
  }
if(i<n)
  //act if found
  printf("value %d found in cell (%d,%d)\n",value,i,j);
else
  printf("value %d not found\n",value);
Замечу также, что первый предложенный в статье способ обойтись без оператора GOTO хуже, чем вариант с ним: он маскирует оператор GOTO лишними переменными и проверками. Второй же способ почти не отличается от приведенного
выше, если не считать того, что он слишком зависит от способа представления двумерных массивов.
87.118.115.69 12:15, 7 октября 2008 (UTC)
== Goto и вложенные циклы со счётчиками в C (и производных ЯП) ==
Не то, что бы я против goto — наоборот, очень часто его использую. Но в случае, когда нужно выйти из вложенного цикла, имеющего счётчик — можно использовать полезное свойство: в C (и производных ему ЯП) переменную-счётчик можно изменять внутри цикла.
Пример:
// ...
for (int i=0;i<m;i++)
{
	// быдлокод
	for (int g=0;g<n;g++)
	{
		// быдлокод
		if (/* условие для прекращения всех циклов */)
		{
			i=m;
			break;
		} else;
		// быдлокод
	}
	// тут ничего не должно быть
}
// ...
Но этот пример подойдёт только в том случае, если за вложенным циклом ничего не должно выполняться (о чём упомянуто в комментарии).
P.S. Это частный случай для удовлетворения чувства собственной важности явных противников goto.
46.175.64.21 11:48, 27 июля 2014 (UTC)
== Из текста статьи: goto сохранился в Аде — одном из наиболее продуманных с точки зрения архитектуры языков за всю историю.[4] ==
То что это написано в книге, это еще не является каким-то подтвержением. В чем авторитетность этого источника?
thread_title:  Хорошая статья 

message: Различные операторы языков программирования обычно употребляются не потому, что они есть, а потому, что этого требует логика решения задачи. Если следовать концепции структурного программирования, надобность в этом операторе отпадает сама собой. Особенно если не подгонять шаблонные языковые констукции под задачу, а решать задачу с помощью языка программирования.
В частности, приведенный пример в GOTO#Оправданное применение поиска числа в двумерном массиве может быть решен без применения GOTO и его заменителей (вроде break и continue):
int matrix[n][m];
int value;
...
int i=0,j=0;
while(i<n && matrix[i][j]!=value)
  if(j<m-1)
    j++;
  else{
    i++; j=0;
  }
if(i<n)
  //act if found
  printf("value %d found in cell (%d,%d)\n",value,i,j);
else
  printf("value %d not found\n",value);
Замечу также, что первый предложенный в статье способ обойтись без оператора GOTO хуже, чем вариант с ним: он маскирует оператор GOTO лишними переменными и проверками. Второй же способ почти не отличается от приведенного
выше, если не считать того, что он слишком зависит от способа представления двумерных массивов.
87.118.115.69 12:15, 7 октября 2008 (UTC)
thread_title:  Слово против GOTO 

message: Не то, что бы я против goto — наоборот, очень часто его использую. Но в случае, когда нужно выйти из вложенного цикла, имеющего счётчик — можно использовать полезное свойство: в C (и производных ему ЯП) переменную-счётчик можно изменять внутри цикла.
Пример:
// ...
for (int i=0;i<m;i++)
{
	// быдлокод
	for (int g=0;g<n;g++)
	{
		// быдлокод
		if (/* условие для прекращения всех циклов */)
		{
			i=m;
			break;
		} else;
		// быдлокод
	}
	// тут ничего не должно быть
}
// ...
Но этот пример подойдёт только в том случае, если за вложенным циклом ничего не должно выполняться (о чём упомянуто в комментарии).
P.S. Это частный случай для удовлетворения чувства собственной важности явных противников goto.
46.175.64.21 11:48, 27 июля 2014 (UTC)
thread_title:  Goto и вложенные циклы со счётчиками в C (и производных ЯП) 

message: То что это написано в книге, это еще не является каким-то подтвержением. В чем авторитетность этого источника?
thread_title:  Из текста статьи: goto сохранился в Аде — одном из наиболее продуманных с точки зрения архитектуры языков за всю историю.[4]