Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оператор перехода goto, тру или нет? 
:(
    Опции темы
sgrey
Дата 21.12.2007, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



если goto не нарушает естественного хода программы (т.е. нет скачков вверх кода) то вполне можно его использовать, конечно же с умом и не пихать везде где можно... особенно учитывая что практически в любом случае можно обойтись и без него... 
PM MAIL   Вверх
xvr
Дата 21.12.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(UniBomb @ 14.12.2006,  21:02)
Никогда не использовал и запрет преподавателей на использование оператора воспринимал как должное. Но всё таки интересно, почему не рекомендуется использовать goto в программах? Это чисто эстетические причины или же некорректность в работе оператора?

Вообще то не рекомендуется, ну например так:
Код

int
recog_1 (x0, insn, pnum_clobbers)
     register rtx x0;
     rtx insn;
     int *pnum_clobbers;
{
  register rtx *ro = &recog_operand[0];
  register rtx x1, x2, x3, x4, x5;
  int tem;

  x1 = XEXP (x0, 1);
  if (GET_MODE (x1) != SImode)
    goto ret0;
  switch (GET_CODE (x1))
    {
    case ASHIFT:
      goto L80;
    case IOR:
      goto L59;
    case AND:
      goto L73;
    case NOT:
      goto L561;
    case NEG:
      goto L600;
    case HIGH:
      goto L715;
    case EQ:
    case NE:
    case LT:
    case LE:
    case GE:
    case GT:
    case LTU:
    case LEU:
    case GEU:
    case GTU:
      if (relop (x1, SImode))
    {
      ro[1] = x1;
      goto L551;
    }
    }
  L555:
  if (even_relop (x1, SImode))
    {
      ro[1] = x1;
      goto L556;
    }
  if (odd_relop (x1, SImode))
    {
      ro[1] = x1;
      goto L583;
    }
  goto ret0;

  L80:
  x2 = XEXP (x1, 0);
  switch (GET_CODE (x2))
    {
    case ZERO_EXTRACT:
      if (GET_MODE (x2) == SImode && 1)
    goto L81;
      break;
    case CONST_INT:
      if (XWINT (x2, 0) == -1 && 1)
    goto L55;
    }
  goto ret0;

  L81:
  x3 = XEXP (x2, 0);
  if (register_operand (x3, SImode))
    {
      ro[1] = x3;
      goto L82;
    }
  goto ret0;

  L82:
  x3 = XEXP (x2, 1);
  if (GET_CODE (x3) == CONST_INT && int5_operand (x3, SImode))
    {
      ro[2] = x3;
      goto L83;
    }
  goto ret0;

  L83:
  x3 = XEXP (x2, 2);
  if (GET_CODE (x3) == CONST_INT && int5_operand (x3, SImode))
    {
      ro[3] = x3;
      goto L84;
    }
  goto ret0;

  L84:
  x2 = XEXP (x1, 1);
  if (GET_CODE (x2) == CONST_INT && int5_operand (x2, SImode))
    {
      ro[4] = x2;
      if (INTVAL (operands[2]) + INTVAL (operands[3]) + INTVAL (operands[4]) == 32)
    return 12;
      }
  goto ret0;

  L55:
  x2 = XEXP (x1, 1);
  if (register_operand (x2, SImode))
    {
      ro[1] = x2;
      return 8;
    }
  goto ret0;

  L59:
  x2 = XEXP (x1, 0);
  if (GET_MODE (x2) != SImode)
    goto ret0;
  if (GET_CODE (x2) == ASHIFT && 1)
    goto L60;
  if (register_operand (x2, SImode))
    {
      ro[1] = x2;
      goto L67;
    }
  goto ret0;

  L60:
  x3 = XEXP (x2, 0);
  if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == -1 && 1)
    goto L61;
  goto ret0;

  L61:
  x3 = XEXP (x2, 1);
  if (register_operand (x3, SImode))
    {
      ro[1] = x3;
      goto L62;
    }
  goto ret0;

  L62:
  x2 = XEXP (x1, 1);
  if (register_operand (x2, SImode))
    {
      ro[2] = x2;
      return 9;
    }
  goto ret0;

  L67:
  x2 = XEXP (x1, 1);
  if (GET_MODE (x2) == SImode && GET_CODE (x2) == ASHIFT && 1)
    goto L68;
  goto ret0;

  L68:
  x3 = XEXP (x2, 0);
  if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == -1 && 1)
    goto L69;
  goto ret0;

  L69:
  x3 = XEXP (x2, 1);
  if (register_operand (x3, SImode))
    {
      ro[2] = x3;
      return 10;
    }
  goto ret0;

  L73:
  x2 = XEXP (x1, 0);
  if (GET_MODE (x2) == SImode && GET_CODE (x2) == ASHIFT && 1)
    goto L74;
  goto ret0;

  L74:
  x3 = XEXP (x2, 0);
  if (register_operand (x3, SImode))
    {
      ro[1] = x3;
      goto L75;
    }
  goto ret0;

  L75:
  x3 = XEXP (x2, 1);
  if (GET_CODE (x3) == CONST_INT && int5_operand (x3, SImode))
    {
      ro[2] = x3;
      goto L76;
    }
  goto ret0;

  L76:
  x2 = XEXP (x1, 1);
  if (immediate_operand (x2, SImode))
    {
      ro[3] = x2;
      if (mak_mask_p (INTVAL (operands[3]) >> INTVAL (operands[2])))
    return 11;
      }
  goto ret0;

  L561:
  x2 = XEXP (x1, 0);
  if (odd_relop (x2, SImode))
    {
      ro[1] = x2;
      goto L562;
    }
  goto ret0;

  L562:
  x3 = XEXP (x2, 0);
  if (register_operand (x3, CCEVENmode))
    {
      ro[2] = x3;
      goto L563;
    }
  goto ret0;

  L563:
  x3 = XEXP (x2, 1);
  if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1)
    return 74;
  goto ret0;

  L600:
  x2 = XEXP (x1, 0);
  if (GET_MODE (x2) != SImode)
    goto ret0;
  if (GET_CODE (x2) == NOT && 1)
    goto L601;
  if (relop (x2, SImode))
    {
      ro[1] = x2;
      goto L589;
    }
  L594:
  if (even_relop (x2, SImode))
    {
      ro[1] = x2;
      goto L595;
    }
  if (odd_relop (x2, SImode))
    {
      ro[1] = x2;
      goto L626;
    }
  goto ret0;

  L601:
  x3 = XEXP (x2, 0);
  if (odd_relop (x3, SImode))
    {
      ro[1] = x3;
      goto L602;
    }
  goto ret0;

  L602:
  x4 = XEXP (x3, 0);
  if (register_operand (x4, CCEVENmode))
    {
      ro[2] = x4;
      goto L603;
    }
  goto ret0;

  L603:
  x4 = XEXP (x3, 1);
  if (GET_CODE (x4) == CONST_INT && XWINT (x4, 0) == 0 && 1)
    return 79;
  goto ret0;

  L589:
  x3 = XEXP (x2, 0);
  if (register_operand (x3, CCmode))
    {
      ro[2] = x3;
      goto L590;
    }
  goto L594;

  L590:
  x3 = XEXP (x2, 1);
  if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1)
    return 77;
  goto L594;

  L595:
  x3 = XEXP (x2, 0);
  if (register_operand (x3, CCEVENmode))
    {
      ro[2] = x3;
      goto L596;
    }
  goto ret0;

  L596:
  x3 = XEXP (x2, 1);
  if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && 1)
    return 78;
  goto ret0;

  L626:
  x3 = XEXP (x2, 0);
  if (register_operand (x3, CCEVENmode))
    {
      ro[2] = x3;
      goto L627;
    }
  goto ret0;

  L627:
  x3 = XEXP (x2, 1);
  if (GET_CODE (x3) == CONST_INT && XWINT (x3, 0) == 0 && pnum_clobbers != 0 && 1)
    {
      *pnum_clobbers = 1;
      return 81;
    }
  goto ret0;

  L715:
  x2 = XEXP (x1, 0);
  if (GET_MODE (x2) == SImode && GET_CODE (x2) == UNSPEC && XINT (x2, 1) == 0 && XVECLEN (x2, 0) == 1 && 1)
    goto L716;
  goto ret0;

  L716:
  x3 = XVECEXP (x2, 0, 0);
  if (GET_CODE (x3) == LABEL_REF && 1)
    goto L717;
  goto ret0;

  L717:
  x4 = XEXP (x3, 0);
  ro[1] = x4;
  return 103;

  L551:
  x2 = XEXP (x1, 0);
  if (register_operand (x2, CCmode))
    {
      ro[2] = x2;
      goto L552;
    }
  goto L555;

  L552:
  x2 = XEXP (x1, 1);
  if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1)
    return 72;
  goto L555;

  L556:
  x2 = XEXP (x1, 0);
  if (register_operand (x2, CCEVENmode))
    {
      ro[2] = x2;
      goto L557;
    }
  goto ret0;

  L557:
  x2 = XEXP (x1, 1);
  if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && 1)
    return 73;
  goto ret0;

  L583:
  x2 = XEXP (x1, 0);
  if (register_operand (x2, CCEVENmode))
    {
      ro[2] = x2;
      goto L584;
    }
  goto ret0;

  L584:
  x2 = XEXP (x1, 1);
  if (GET_CODE (x2) == CONST_INT && XWINT (x2, 0) == 0 && pnum_clobbers != 0 && 1)
    {
      *pnum_clobbers = 1;
      return 76;
    }
  goto ret0;
 ret0: return -1;
}

Файл insn-recog.c из gcc

PM MAIL   Вверх
Mayk
Дата 21.12.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(xvr @  21.12.2007,  20:05 Найти цитируемый пост)

Вообще то не рекомендуется, ну например так:

Это сгенерированный код. В сгенерированном коде читабельность занимает последнее место. имхо. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
xvr
Дата 21.12.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Mayk @ 21.12.2007,  16:11)
Цитата(xvr @  21.12.2007,  20:05 Найти цитируемый пост)

Вообще то не рекомендуется, ну например так:

Это сгенерированный код. В сгенерированном коде читабельность занимает последнее место. имхо.

Проблема в том, что иногда ТАК пишут и руками - вот для таких 'умельцев' и запрещают пользоваться goto. Нормальный вменяемый программист пользуется goto только там, где это действительно надо (т.е. почти нигде smile )

PM MAIL   Вверх
MAKCim
Дата 21.12.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(xvr @  21.12.2007,  18:30 Найти цитируемый пост)
Нормальный вменяемый программист пользуется goto только там, где это действительно надо (т.е. почти нигде smile )

на ядро Linux посмотрите
по вашим словам получается, что его шизофреники пишут  smile 
еще раз говорю, долой предрассудки
если уж на то пошло, то нет таких ситуаций, где "это действительно надо"
все можно переписать без goto
но с goto очень часто понятнее, быстрее и логичнее

Это сообщение отредактировал(а) MAKCim - 21.12.2007, 23:44


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SaDFromSpb
Дата 22.12.2007, 07:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(Cycle @  21.12.2007,  00:17 Найти цитируемый пост)
А исключения это уже сложно? Люди стараются придумывают замену goto для вас, а вы... smile 

Цитата(MAKCim @  21.12.2007,  00:31 Найти цитируемый пост)
не всегда оправдано
исключения - крайне тяжеловесный механизм
для прикладной логики самое то, но для критичных участков не подойдет 


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




--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
MAKCim
Дата 22.12.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(SaDFromSpb @  22.12.2007,  07:21 Найти цитируемый пост)
Не только поэтому. Исключения - это только для исключительных ситуаций. Уж лучше использовать goto, вместо того чтобы использовать исключения, как элемент логики программы при ее нормальной работе.

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 24.12.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(MAKCim @  22.12.2007,  10:43 Найти цитируемый пост)
я, честно говоря, не видел, чтобы где-нибудь исключения использовались не для исключительных ситуаций

я у страуса видел smile
имхо в большинстве случаев можно переписать код без гоуту и при этом в читабельность только вырастет... Хотя иногда без этого нельзя. У меня оператор goto появлялся только в очень больших функциях(неправильно спроектированных) smile.
PM MAIL Skype GTalk   Вверх
bsa
Дата 24.12.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Lazin, а у меня оператор goto появляется только там, где я это запроектировал. В частности, в функции с таблицей переходов (расширение gcc - позволяет преобразование void* к метке и обратно).
PM   Вверх
GrayCardinal
Дата 24.12.2007, 14:16 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Народ, имейте совесть, что значит "нельзя использовать" оператор, который есть по стандарту в языке ? Не хочешь - не используй. Всё.

Это сообщение отредактировал(а) GrayCardinal - 24.12.2007, 14:17


--------------------
PM MAIL WWW   Вверх
Albanec
Дата 30.12.2007, 17:34 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.12.2007

Репутация: нет
Всего: нет



    По мне дак оператор готу ето как одна из возможностей реализовать свою идею, и я скажу противникакм данного оператора что не стоит брызгая слюной арать что применение данного оператора не есть хорошо и что его применение приведет всех в ад))) По моему ето бред, 
    После создания нескольких програм на ассемблере, я понимаю что кроме оператора goto нету ни одного оператора который бы его заменил(в смысле на низком уровне прогрммирования), так что все операторы похожи на goto(просто в машином языке(ассемблер)нету других операторов), приведите мне хоть один низкоуровневый оператор типа if()  я вам памятник поставлю)).
   И скажите мне зачем его вводят во всех языках программирования если он "НЕ НУЖЕН ИЛИ БЕЗ НЕГО МОЖНО ОБОЙТИСЬ"???? 
   А на сечёт читаемости кода, полностью согласен читается трудно, но после некоторого опыта программирования на ассемблере ето детские сказки))
   Вообщем моё мнеие такое если использовать данный оператор то только если: без него не обоитись, или он улутшит читаемость кода.
   Но не в коем случае нельзя ставить крест на даном операторе)) надо его использовать с умом)) 

PM MAIL   Вверх
SaDFromSpb
Дата 30.12.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(Lazin @  24.12.2007,  08:54 Найти цитируемый пост)
я у страуса видел

??!! Хде? Ссылку в студию!



--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
nerezus
Дата 30.12.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

 И скажите мне зачем его вводят во всех языках программирования если он "НЕ НУЖЕН ИЛИ БЕЗ НЕГО МОЖНО ОБОЙТИСЬ"???? 
 Так поэтому его в куче языков и нету ;)

Цитата

что кроме оператора goto нету ни одного оператора который бы его заменил
 Но это только в языках низкого уровня. А мы говорим про С.

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


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Mayk
Дата 1.1.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Albanec @  30.12.2007,  21:34 Найти цитируемый пост)

   И скажите мне зачем его вводят во всех языках программирования если он "НЕ НУЖЕН ИЛИ БЕЗ НЕГО МОЖНО ОБОЙТИСЬ"???? 

В яве реализован выход из вложенных циклов. goto там уже нет. не помню чтоб кому то из за этого приходилось страдать.
Цитата(nerezus @  30.12.2007,  23:02 Найти цитируемый пост)

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

 smile 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 1.1.2008, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Mayk
логика, которую можно описать табличными переходами внутри функции
Код

static void __calculate() {
    void * table[N] = {
        &&label1, &&label2, ..., &&labelN
    };
    
label1:
...
label2:
...
labelN:
...
}

компилятор GCC

Это сообщение отредактировал(а) MAKCim - 1.1.2008, 11:00


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.