Найдены возможные дубликаты

Отредактировал Emvoln 1 год назад
+96

А внутри все равно инструкции J* (JZ/JNZ/JG и т. п.) или LOOP :)

раскрыть ветку 24
+53

А внутри всё равно машинные коды (0x0F8X /0xEX) :)

раскрыть ветку 14
+49

Вот! полегче! Архитектуру указываем!)))

раскрыть ветку 4
+6

Ну а в самом конце хотя бы нолики и единички?

раскрыть ветку 8
+10
Когда я, не имея профильного образования, пытаюсь освоить программирование и вижу такие комментарии, становится очень грустно.
раскрыть ветку 3
+27

Поверь, тут и с профильным обычно невесело )

+1

Ассемблер. J* - jump (переход), вторая буква указывает, при каком условии (относительно разности чисел). Например JZ - Jump Zero (переход, если разность 0, т.е. числа равны).

Все переходы более высокоуровневых языков, как условные, так и безусловные, так или иначе реализуются через эти команды.

раскрыть ветку 1
+4

А внутри все равно p-n-p переход

+1

А внутри mov eip, 0x12345678

раскрыть ветку 1
+2

А в ответ: "Программа выполнила недопустимую операцию и будет закрыта."

0

О боже, нет, НЕТ

0

Не обязательно.

+42

- У меня бы всё получилось, если бы не эти ваши любопытные дизасемблеры!

раскрыть ветку 1
+12

Руби-дуби-ду!

+60
Иллюстрация к комментарию
раскрыть ветку 15
+17

Вместо C++ там можно поставить еще Ruby и Python :)

раскрыть ветку 14
0

Тут тонкость в том, что код C++ переводится компилятором в код C, а код C генерирует соответствующий ассемблерный код. Отсюда и эффективность. То есть, программируя на плюсах в конечном счете вы пишете на ассемблере.

раскрыть ветку 13
+9

мммм, пахнуло первыми прогами на бейсике для спеки

раскрыть ветку 5
+6

Это как запах молока матери для прогера.

раскрыть ветку 4
+1

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

раскрыть ветку 3
+25
goto или не goto?

В 1968 году, в своей статье «Обоснование пагубности оператора goto», Эдсгер Дейкстра отметил, что качество кода обратно пропорционально количеству goto, используемых в коде. Дейкстра утверждал (это просто его мнение), что:
§ корректность кода без goto доказать легче
§ код с операторами goto трудно форматировать
§ goto влияет на логическую структуру программы
§ применение goto препятствует оптимизации, выполняемой компилятором
§ goto усложняет анализ кода
· На практике применение оператора goto, приводит к нарушению принципа хода алгоритма строго сверху вниз.
· Сторонники goto выступают за осторожное применение оператора, при определенных условиях.
· Большинство аргументов против goto, не говорит о полном отказе от этого оператора, а предостерегает от неразборчивого его использования.
· Хорошее программирование не означает исключение всех goto.
· Стремление к коду без goto не должно быть целью.
· Десятилетия исследований оператора goto не смогли подтвердить его вредоносность, а теоретические и экспериментальные доводы, выдвигаемые против этого оператора, оказались не убедительными.
· И наконец, операторы goto входят во множество современных языков.
· Microsoft чаще использует goto при автогенерации кода, когда этот код не предназначен для восприятия и редактирования человеком. Корректность такого кода определяется корректностью создающего его инструмента.
· Использование goto – это вопрос религии
раскрыть ветку 51
+9

Как неоднократно говорилось: "Дай дураку стеклянный хуй - он и его разобьёт и руки порежет".

Точно таким же макаром можно указатели и адресные операции запретить (что, собственно, эти ваши пехапе и прочие питоны с успехом и делают), чтобы "не дай бог не туда move сделал".


GoTo - обычный инструмент. Один из.

З.Ы. Да, иногда использую, в cmd-скриптах. И в хранимках TSQL, тоже он в тему иногда.

раскрыть ветку 4
+1

а зачем нужны в PHP адресные операции? есть &var и этого вполне достаточно... считай тот-же указатель, но без манипулирования адресами и смещениями типа *p++

раскрыть ветку 3
+6

Ох уж эти ваши суеверия i++, ++i

раскрыть ветку 15
+18

ну так i++ и ++i это немного разные операции. при чём тут суеверия?

ещё комментарии
+2

Похоже на несколько устаревший взгляд на вопрос. За почти 10 лет в разработке ни разу не натыкался на оправданное использование goto или на место, которое стало бы лучше, если goto туда добавить

раскрыть ветку 28
+3

Мсье плохой политик. Надо втихаря добавить goto, а потом под предлогом наличия goto выпиливать весь файл / модуль

раскрыть ветку 1
+2
Выход из нескольких вложенных циклов, когда в языке нет возможности break с указанием цикла для выхода
раскрыть ветку 19
0

cmd-shell. Большой скрипт с мало-мальским наличием логических ветвлений без goto не напишешь.

И не надо про PowerShell рассказывать, 20 лет назад его не было. И альтернативы cmd - тоже.

раскрыть ветку 5
0

в switch/case внутри тот-же goto будет...

* и вообще это уже и не актуально )

** goto просто делает код запутанным, поэтому и считался нежелательным оператором ранее.

+11
JMP
раскрыть ветку 1
+2

BEQ, BNE

+13

Я знаю 2 случая когда goto упрощает код:

1) В функции несколько return и перед каждым нужно освободить память и закрыть дескрипторы. Чтобы не дублировать код, вместо return'ов ставим goto на конец функции и после метки втыкаем весь завершающий код.

2) Выход из нескольких вложенных циклов, когда мы уже всё посчитали, всё понятно но корректно завершить все эти циклы сильный гемор - goto как это не странно упростит код.


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

раскрыть ветку 28
+14
Иллюстрация к комментарию
раскрыть ветку 1
+6

Блин, я аж покраснел. :)

+2

Возможно, первое решается использованием using (C#) или RAII.

Второе можно решить вынесением цикла со вложенным циклом в отдельный метод.

0

Во втором случае можно все циклы засунуть в функцию и использовать return. По факту те же яйца только в профиль, но return как то роднее)

0
Никогда не пользовался готу, и на с умею писать только хелловорлды, но объясните, пожалуйста, это не то же, что вызвать метод в той же джаве?
раскрыть ветку 1
0

если ты серьезно, то goto - это резкий переход к другому коду вообще. А метод это как вызов подпрограммы с прерыванием основной (если что не правильно написал - тыкните носом, но пруфы бы)

0

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

0

я бы подумал, что 1 - все фрии и прочее должно делаться неявно в соответствующих деструкторах, но с динамической аллокацией у меня опыта мало,  да и от языка зависит.

2. иной раз действительно хочется написать один goto вместо if'ов с брейками на каждый уровень, но привычка говорит использовать строго второй вариант

раскрыть ветку 1
+3

1) Деструкторы не всегда доступны, например в Сях.

2) У вас скажем есть функция, у неё есть локальные вещи которые не хочется вытаскивать наружу даже на уровень класса, просто чтобы не засирать.

3) Иногда, вместо того чтобы просто дёрнуть функцию приходится сначала инстанцировать объект, затем дергать из него функцию затем этот объект уничтожать (ну или он грохнется сам, если на стеке) и всё только для того чтобы воспользоваться "преимуществом" деструктора.


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

-2

Во втором случае - может быть, но я обычно делаю несколько более замудренно. Снаруже цикла объявляю булевскую переменную isComplete = false, когда все посчитали - ставлю ее в true, и на каждом цикле ее проверяю. Если true - то break. Наверное, использовать goto там логичнее - но эстетически это примерно как завершать любой разговор словами "пошел на хуй".


А зачем нужно несколько return'ов? В начале функции создаешь переменную toReturn нужного типа, в конце - ставишь return toReturn, а в самой функции - присваиваешь ей нужное значение. Все. Больше одного return'а в функции - прежде всего, лишняя возможность самому запутаться.

-3

Еще можно использовать goto в некоторых языках, где нет оператора switch. Как-то так:

switch(a) {

case 1:

  print("1");

case 2:

  print("12");

  break;

default:

  print("none");

}


_case_1:

if (a != 1) goto _case_2;

print("1");

_case_2:

if (a != 2) goto _case_default;

print("12");

goto _switch_end;

_case_default:

print("none");

_switch_end:

раскрыть ветку 3
+6

Можно, но лучше не стоит:

if (a != 1)

  print("1");

else if (a != 2)

  print("12");

else

  print("none");

ещё комментарии
-4

Что 1, что 2 говнокод.

раскрыть ветку 13
+4

А можно пояснить за 2ой пример? Как иначе выходить из всех циклов? Исключением? Или может тут будет аргумент - "Не делайте циклов в цикле"?)

раскрыть ветку 5
0
Ну иди скажи Линусу, что он говнокодер.
раскрыть ветку 4
0

Вы всегда столь кратки?

раскрыть ветку 1
+4

всегда бесило, что преподы твердили "не использовать goto!", а как спрашиваешь почему нельзя, так сразу "нууу... хз, так где то было написано". мозги надо использовать, а не список "правильных" команд

раскрыть ветку 5
+2

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

раскрыть ветку 2
0

ОС не логичная программа, тк. прыгает от одного процесса к другому, а не исполняет процесс до конца.

0

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

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

+1

Читаемость кода - самая главная причина отказа от goto. Через неделю офигеешь вспоминать, какой goto куда ведет и почему. А уж если кто другой разбираться в этой свалке будет...

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

раскрыть ветку 1
0

напишите интерпретатор кода в графические схемы, если для вашего языка его не написали.

+4

Сложнааа

+5
,переведите пожалуйста...
раскрыть ветку 23
+49

В академическом программировании очень не любят инструкцию "goto ..." (переход к выполнению указанного участка кода). Отчасти это правильно, потому как её использование может сделать код сложным для восприятия и отладки (что могу подтвердить, так как лично видел и отлаживал подобный код). Зато очень любят конструкцию do ... while (цикл с выходом по условию) и ещё больше for ... (цикл с выходом по условию и итератором). Так вот, автор намекает, что в основе этих конструкций лежит всё тот-же нелюбимый всеми goto, что, в принципе, так и есть. Вот только они облекают goto в такую форму, что даже самый опытный программист не сможет запутать ими код до степени тарелки со спагетти.

раскрыть ветку 9
+3

По сути вызов функции тоже является формой goto.

раскрыть ветку 1
+2
что даже самый опытный программист не сможет запутать ими код до степени тарелки со спагетти

ИЗИ. Надо просто представить control flow в явном виде.

https://pastebin.com/c80Sf7kt

раскрыть ветку 3
0

добавить переход через переполнение памяти

раскрыть ветку 2
+18

команда "goto" - злодей для программистов, спрятана под масками while и for циклов

раскрыть ветку 2
+6

Скорее это зло, аккуратно обернутое во благо

раскрыть ветку 1
-23

Если используешь GOTO - ты не тру программер, тру программеры используют только условные операторы.

раскрыть ветку 9
+12
Goto вполне себе нормальная инструкция, помогающая иногда избежать сложностей
раскрыть ветку 7
-2

<сарказм>Тру программеры не используют условные операторы, они используют полиморфизм.</сарказм>

ещё комментарии
+4

а где foreach?

раскрыть ветку 5
+8

а также do..until или repeat..until

+2

Равносильно for

раскрыть ветку 3
+2

.foreach(

раскрыть ветку 2
+1

Когда прогаешь на ассемблере

+1
Это единственное, что я запомнил с института.
0
смищные погромиздские щютки уровня GTFO
-1

Какой стаж работы программиста нужен, чтобы понять шутку?

-6

Шутка от петросяна

ещё комментарий
Похожие посты
Возможно, вас заинтересуют другие посты по тегам: