Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2010, 15:27   #11
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от wyvern Посмотреть сообщение
Что значит "можно" и так?
Мне пришлось потратить не одну минуту, чтобы понять, что в Вашем коде выполняется после чего...

Был бы алгоритм сложнее - он в принципе перестал бы быть поддерживаемым...
Это шикарный пример того, как НЕ надо использовать этот долбаный оператор, если не горишь желанием подпортить жизнь человеку, который будет за тобой код править...
все и так ясно, что с оператором if, что с goto. чтобы вспомнить функцию из предыдщего поста у меня ушло несколько секунд, хотя написана она была околоа половины года назад и без коментов.
подпись
liljon вне форума Ответить с цитированием
Старый 14.07.2010, 15:33   #12
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Я вечером этим займусь, ладно? Дедлайн неуклонно подползает
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Старый 16.07.2010, 12:07   #13
Card1nal
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 44
По умолчанию

А можно я немного поизвращаюсь?


Код:
#include <stdlib.h>
#include <stdio.h>
int main()
{
  int i = 0;
 INCR: i++;
  if (i < 10)
    goto INCR;
  printf("%d\n", i);
  return (EXIT_SUCCESS);
}
А вообще практически всегда, как правильно сказал Stilet, он просто-напросто не нужен и затрудняет понимание кода.
Card1nal вне форума Ответить с цитированием
Старый 16.07.2010, 18:18   #14
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Впрочем, его действительно использовать можно использовать в некоторых случаях, где не существует более изящных решений, но необходимо использовать одно правило - осуществлять переход только вперед, иначе можно перейти в очень неожиданные места и получить очень трудноотлавливаемые ошибки.
Объясните, плиз, по подробнее: из-за чего могут возникнуть проблемы, при использовании оператора goto для перехода назад? Что это за неожиданные места, и от куда могут взяться трудноуловимые ошибки?
Oleg_SK вне форума Ответить с цитированием
Старый 16.07.2010, 18:27   #15
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Oleg_SK Посмотреть сообщение
Объясните, плиз, по подробнее: из-за чего могут возникнуть проблемы, при использовании оператора goto для перехода назад? Что это за неожиданные места, и от куда могут взяться трудноуловимые ошибки?
Из-за того, что если Вы берете чужой код и начинаете в нем разбираться, чертыхаться на этот гоуту Вы будете достаточно сильными выражениями. Вот такие могут возникнуть проблемы.

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

Пока что ЕДИНСТВЕННОЕ действительно полезное использование, которое я видел - это выход из нескольких циклов наружу, но прыгают тогда вперед и сразу за пределы цикла, не сбивая восприятие алгоритма.

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

liljon прошу прощения, но я пожалуй забью на Ваш код. На этой неделе мне так вынесли мозг на работе, что прыгать глазами еще и по чужому коду мне совершенно неохота... Так что это чуть позже.
wyvern@localhost:~$ sudo emerge --unmerge world

Последний раз редактировалось wyvern; 16.07.2010 в 18:45.
wyvern вне форума Ответить с цитированием
Старый 16.07.2010, 18:51   #16
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

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

Цитата:
Сообщение от wyvern Посмотреть сообщение
И то, последнее время все чаще и чаще слышу советы в данной ситуации использовать try-catch блок и просто-напросто из глубины циклов выкидывать простенькое исключеньице...
Интересно: что лучше по скорости выполнения и/или по размеру кода?
Oleg_SK вне форума Ответить с цитированием
Старый 16.07.2010, 19:06   #17
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Читал где-то, что один американец (работает в какой то крутой фирме по разработке ПО, но это не сильно важно) даже написал статью про goto. Так он там описал все минуса данного оператора. Вот такой он популярный этот goto .
profi вне форума Ответить с цитированием
Старый 16.07.2010, 19:32   #18
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от liljon Посмотреть сообщение
отя написана она была ... без коментов.
Вообще-то, я бы не стал этим хвастаться...
Код:
bool ParseBadWords( string &str, FILTER filter, REPORT &report ) {

   bool ret = false;
   report.out = "";
   report.badword->DeleteAll();
   report.bpos.clear();
   LList* list = new LList() ;

   int c = FindWords(str,list,filter);
   for (int i=0;i<c;i++) {
      string line = list->Strings(i),temp = line;
      //line = CutSameSymbols(line);

      if (filter.CheckHideWord) {
         if (CheckHideWord(line,filter)) {
            if (filter.changeto != "" ) line = filter.changeto;
               report.type = HIDE_WORD;
               report.out += "\"" + temp + "\" is possible hided word\n";
               // goto EXCEPT;
               return IsExcept( filter, list, report, line, i ) ;
            }
         }

         line = CutSameSymbols(line);
         line = CutSymbols(line,filter.symbols);

         int r = CheckExcept(line,filter);
         if (r == EXCEPT_CHANGED) {
            report.type = EXCEPT_CHANGED;
            report.out += "\"" + temp + "\" is chagned to \"" + line + "\"\n";
            // goto EXCEPT;
            return IsExcept( filter, list, report, line, i ) ;
         } else if (r == EXCEPT_TRUE) {
            report.type = EXCEPT_TRUE;
            report.out += "\"" + temp + "\" is except word\n";
            // goto EXCEPT;
            return IsExcept( filter, list, report, line, i ) ;
         }

         LList * words = new LList();
         if (!TransformWord(line,filter.letter,words)) {
            if ( Check(line,temp,filter,report) > -1) {
               delete words;
               report.type = BAD_WORD_FOUND;
// EXCEPT:
               // if (filter.changeto != "") list->Rewrite(line,i);
               // if (report.type != EXCEPT_TRUE) ret = true;
               return IsExcept( filter, list, report, line, i ) ;
            } else delete words;
         } else {
            for (int j=0;j<words->Count;j++) {
               string s = words->Strings(j);
               if (Check(s,temp,filter,report) > -1) {
                  if (filter.changeto != "") list->Rewrite(s,i);
                     ret = true;
                  report.out += "with transform " + words->Strings(j) + "\n";
               }
            }
            delete words;
         }

   }

   return ret ;

}


bool IsExcept( FILTER filter, LList* list, REPORT& report, string line, int i ) {

   bool ret = false ;
   if (filter.changeto != "") list->Rewrite(line,i);
   if (report.type != EXCEPT_TRUE) ret = true;

   return ret ;

}
Vago вне форума Ответить с цитированием
Старый 16.07.2010, 19:57   #19
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Мыщъх советует буквально следующее:
Цитата:
Не пренебрегайте оператором goto - зачастую он позволяет проектировать более компактный и элегантный код
А по поводу лапши - это смотря как готовить. Из тернарных операторов, например, она ничем не лучше
пыщь
JTG вне форума Ответить с цитированием
Старый 16.07.2010, 20:03   #20
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Читал где-то, что один американец (работает в какой то крутой фирме по разработке ПО, но это не сильно важно) даже написал статью про goto. Так он там описал все минуса данного оператора. Вот такой он популярный этот goto .
Голландец. Дейкстрой его звали. А броский заголовок к той статье ему Вирт придумал.
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. использование условного оператора в теле операторов цикла с условием и после него машко Помощь студентам 1 22.06.2009 00:52
использование условного оператора после операторов цикла с условием машко Помощь студентам 8 21.06.2009 23:59
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
Использование оператора условия Virtson Microsoft Office Access 2 15.12.2006 16:13