LINUX.ORG.RU
ФорумTalks

кто тут не любит goto?


0

2

Зачастую оператор goto поможет сильно упростить жизнь или же вообще является единственной вменяемой возможностью.

Например обход в цикле массива переменной размерности без goto реализуется через рекурсию, которая, вообще говоря, не везде разрешена.

★★★★★

я люблю goto, потому что другое не умею. Ну и в асме для AVR без почти goto(rjmp) многого не наделаешь. Так что я за! Ну а бейсик - это вообще сплошное goto, которое отложилось еще со школьных корветов во мне и заставило полюбить компьютеры

minakov ★★★★★
()

Опять эти ваши императивные замашки...

Miguel ★★★★★
()
Ответ на: комментарий от slackwarrior

И как-то жили... Ядра осей писали - никто не умер

А когда-то, можете себе представить, и C не было! То есть совсем! На перфокартах всё выбивали - и никто не умер!

Xellos ★★★★★
()
Ответ на: комментарий от TDrive

кроме запутанности кода

Типа этого мало? Ещё один школьник-недоучка, написавший три хелло-ворлда за всю жизнь?

Xellos ★★★★★
()
Ответ на: комментарий от buddhist

В исходниках gforth можно посмотреть на православное использование вычисляемого goto.

GOTO на Forth? Нет, я понимаю, пишется на раз, но он там... Ну, как notepad.exe под Linux.

KRoN73 ★★★★★
()
Ответ на: комментарий от Xellos

Если далеко - то программисту нужна интенсивная терапия.

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

А в конце функции есть код освобождения памяти.

Что же делать? Ставить флаги, делать дополнительные проверки, или же просто написать goto end;?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Во первых не все программы пишутся для того чтобы их потом читали другие. Про обфускацию слышал?
Во вторых запутанность кода понятие относительное, может для тебя хелло-ворлд это запутанный код, тогда твоя точка зрения становится понятна.
В третьих качество работы программы намного важнее чем понятность кода.

Так, что да, этого мало, я бы даже сказал вообще ниочём.

TDrive ★★★★★
()

Ага а ещё часто упрощает жизнь, если забить на существование оператора delete... А потом кучи тредов C/С++/linux/программисты/программа ujdyj/

erfea ★★★★★
()

Вроде никто не упомянул, что с goto легко ломается инкапсуляция. С его помощью легко отстрелить себе ногу

Zodd ★★★★★
()
Ответ на: комментарий от Zodd

Даже если и добавить, то программа не эквивалентна приведённой выше. Если же там цепочку ифов превратить в if...else, то можно потерять кучу тактов, пока оно будет по else скакать.

Artificial_Thought ★★★★
()
Ответ на: комментарий от cvs-255

и тут память заканчивается

Это исключительная ситуация, и решается она механизмами обработки исключений. Про асм и голый C не будем вспоминать, ok? На дворе давно не 1990.

Xellos ★★★★★
()
Ответ на: комментарий от TDrive

Про обфускацию

Я уже сказал - да, goto вполне пригоден для написания уродливого, неотлаживаемого и неподдерживаемого кода. Всё верно.

качество работы программы намного важнее чем понятность кода

Ну точно - рассуждения написавшего три хелловорлда, никогда не сталкивавшегося с доработкой чужих программ через месяцы и годы, программ из десятков а то и сотен модулей.

Xellos ★★★★★
()
Ответ на: комментарий от amaora

в первом случае (возможно меннее логично ) можно без goto :

static int
clip_line(point_t *s, point_t *e){
	int		s_cc;//Это можно при условии что чистая функция = clip_code(s);
	int		e_cc = clip_code(e);
	float		lim_w = (float) (screen_w - 2);
	float		lim_h = (float) (screen_h - 2);
	float		dx, dy;

	do {
                s_cc = clip_code(s);
		if (s_cc & e_cc)return -1;
		if (!(s_cc | e_cc))return 0;

		if (!s_cc) {
                        int tmp = s_cc;	s_cc = e_cc;e_cc = tmp;

			point_t *ptmp = s;s = e;e = ptmp;
		}

		dx = e->x - s->x; dy = e->y - s->y;

		if ((fabsf(dx) < 1.0f) && (s_cc & 0x03))return -1;
		if ((fabsf(dy) < 1.0f) && (s_cc & 0x0c))return -1;

		if (s_cc & 0x01) {
			s->y = e->y + ((0.0f - e->x) * dy) / dx;
			s->x = 0.0f;
			continue;
		}if (s_cc & 0x02) {
			s->y = s->y + ((lim_w - s->x) * dy) / dx;
			s->x = lim_w;
                        continue;
		}if (s_cc & 0x04) {
			s->x = e->x + ((0.0f - e->y) * dx) / dy;
			s->y = 0.0f;
		}else if (s_cc & 0x08) {
			s->x = s->x + ((lim_h - s->y) * dx) / dy;
			s->y = lim_h;
		}
	}
	while (1);
}

qulinxao ★★☆
()
Ответ на: комментарий от Zodd

Это как раз не аргумент. Ногу себе можно отстрелить с помощью чего угодно, хотя бы вот с помощью указателей. Но вот goto провоцирует на отстрел ноги, да. В отличие от loop managment и обработки исключений, которые делают то, что нужно, и не стреляют по ногам.

Xellos ★★★★★
()
Ответ на: комментарий от qulinxao

Во втором случае тоже. Впрочем второй случай можно и оставить в покое. А можно и переписать ценой добавления 1 строчки в программу.

Xellos ★★★★★
()
Ответ на: комментарий от amaora

Генри Уоррен, мл Алгоритмические трюки для программистов.

Глава 2 основы :

Что бы выделить в слове крайний справа единичный бит ... если такого бита нет возврат 0 :

x & (-x)

в этом случае можно switch прикрутит(всё равно у тя при обнаружении бита всегда переход на следующую точку)

qulinxao ★★☆
()
Ответ на: комментарий от cvs-255

я думаю, что использовать антисимметричный тензор в коде ядра не самая лучшая идея.

nanoolinux ★★★★
()
Ответ на: комментарий от minakov

Ну а бейсик - это вообще сплошное goto, которое отложилось еще со школьных корветов во мне и заставило полюбить компьютеры

«Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации». (Дейкстра же)

quantum-troll ★★★★★
()
Ответ на: комментарий от quantum-troll

Все козыряют этой цитатой, как будто в ней нет явной гиперболы. После тогдашних бейсиков операторы циклов и ветвления в нормальных языках — просто оазис для блуждающего по пустыне. Студенты, о которых говорил Дейкстра, — «девяносто пять процентов», у которых и деградировать нечему.

Xenesz ★★★★
()
Ответ на: комментарий от quantum-troll

Оператор GOTO приучает логически видеть код. А не то что в этих ваших классах - поди разбери где его объявление

minakov ★★★★★
()
Ответ на: комментарий от minakov

логически видеть код

Это как? Функция на 50 экранов с метками и переходами взад-вперед «тру-олд-блэк-дэт-^W^W-спагетти-стайл»? Нафиг-нафиг.

slackwarrior ★★★★★
()
Ответ на: комментарий от minakov

А не то что в этих ваших классах

А никто и не говорил, что ООП в стиле Си++ это что-то хорошее.

quantum-troll ★★★★★
()
Ответ на: комментарий от TDrive

Вот не надо мазаться какбэ обфускацеией. Вручную этим занимаются фрики (знавал «идейного обфускатора», который гордился тем, что пишет непонятно - типа «девелопер-лок-ин»... Чтоб не выгнали. Он потом трудности с трудоустройством испытывал и был вынужден переехать в края непуганных работодателей - в городе карма была уже безнадежно испорчена :)). Обфускация в промышленных масштабах обычно достигается другими средствами. И читать/поддерживать запутанный исходник в этом случае задачи не стоит - у вменяемого аффтара на руках есть человеко-понятный оригинал.

В третьих качество работы программы намного важнее чем понятность кода.

4.2, если не указан критерий «качества». Корректность обычно превыше скорострельности, например. За эффективность в смысле художественного выстригания байтиков и тактиков борются, когда она дает ощутимый профит, и когда к этому есть доказанные (измерениями) показания.

slackwarrior ★★★★★
()
Ответ на: комментарий от HerrWeigel

ака Структурная теорема - не факт что результат читаемее.

кста в C нет [синтаксически] вычисляемого goto - печаль печаль мона конечно свичем однако оно(подобно try/exeption/finally) усложняют внешний вид и искажают структрутуру

так что только масив указателей на функции - goto не нужно.

qulinxao ★★☆
()
Ответ на: комментарий от moscwich

А что плохого в рекурсии?

не везде поддерживается

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Xellos

Про асм и голый C не будем вспоминать, ok?

Загляни в исходники ядра.

Да и на микроконтроллерах тоже часто нужен c/asm, т.к. там памяти кот наплакал

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Блин, вся жизнь вот наша ограничивается микроконтроллерами и обфускацией. Всё остальное - это не программирование, а если программирование, то его доли процента, да.

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

согласен, программистам, которые пытается выдавать ультимативные утверждения, действительно нужна терапия.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Я попрошу пример кода с вложенными циклами, когда из них нужен внезапный выход чёрт знает куда (так чтобы next и last не помогали).

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

Тебе привели уже несколько примеров, где goto нужен.

Ты же продолжаешь в ультимативной форме утверждать, что он не нужен нигде.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Xellos

простейшее:

int found = False;
for (i=1; i<N;i++) {
   for (j=1; j<M;j++) {
     for (k=1; k<t;t++) {
       found = //check some value;
       if (found) { result = ..; goto end;}
     }
   }
}
end:

вариант с велосипедной проверкой found после каждого из цикла _НЕ_ принимается

qnikst ★★★★★
()
Ответ на: комментарий от cvs-255

Резюмируя, мы получаем, что goto нужен во-первых для создания уродливого, нечитаемого, неотлаживаемого и неподдерживаемого кода (обфускация), для создания кода из рассказа «один байт», или как там его, короче в случаях жестокой оптимизации, когда даже вызов c++ компилятора вместо c компилятора банально карается. С этим я не спорю. Тут пытаются доказать, что goto нужен в нормальном коде.

Xellos ★★★★★
()
Ответ на: комментарий от qnikst

внезапный выход чёрт знает куда (так чтобы next и last не помогали)

Приведённый пример - это обычный loop control, который есть в нормальных языках. Тут говорили, что когда у тебя есть пять вложенных циклов, иногда надо перейти из пятого в середину второго, и наоборот. Вот в этих случаях как раз нужна интенсивная терапияю

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

ок.

ну и ручная tail-recursion, кстати, тоже на goto делается.

qnikst ★★★★★
()
Ответ на: комментарий от Xellos

Приведённый пример - это обычный loop control, который есть в нормальных языках.

приведи пример такого нормального языка, для которого есть качественный компилятор (да, я не люблю интерпретируемые языки).

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от qnikst

вариант с велосипедной проверкой found

int found = False;
for (i=1; i<N, (!found);i++) {
   for (j=1; j<M, (!found);j++) {
     for (k=1; k<t, (!found);t++) {
       found = //check some value;
       if (found) { result = ..; break;}
     }
   }
}

В чём велосипедность?

_НЕ_ принимается

Ультимативно?

Xenesz ★★★★
()
Ответ на: комментарий от Xenesz

Многократное дублирование.

cvs-255 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.