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

Поиск:

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


Новичок
***
Награды: 1



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

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



Никогда не использовал и запрет преподавателей на использование оператора воспринимал как должное. Но всё таки интересно, почему не рекомендуется использовать goto в программах? Это чисто эстетические причины или же некорректность в работе оператора?


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 14.12.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Это не только эстетические причины. Вообще на эту тема уже столько раз поднималась... воспользуйся поиском.
goto  нарушает естественное течение программы, т.е. невызов нужных конструкторов/деструкторов, запутанность программ...
Минусов очень много. Средства языка позволяет свободно обходиться без goto.

Однозначно false...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
INHazeR
Дата 14.12.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Whenever possible, you should avoid using gotos in your program. They tend to encourage very convoluted code that can be extremely difficult to follow.

As the goto is theoretically unnecessary - there's always an alternative approach to using goto - a significant cadre of programmers say you should never use it. I don't subscribe to such an extreme view. It is a legal statement after all, and there are occasions when it can be convenient. However, I do recommend that you only use it where you can see an obvious advantage over other options that are available.
PM MAIL   Вверх
MAKCim
Дата 14.12.2006, 21:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



чушь, что его нельзя использовать
главное использовать с умом и когда это действительно облегчает понимание кода
в С++, скорее всего, можно обойтись в большинстве случаев без него, в С много моментов, где его применение оправдано
Если есть желание, посмотри исходники ядра Linux - яркий пример любви к goto  smile

Добавлено @ 21:10 
JackYF
не согласен с тобой, нельзя быть таким категоричным
goto во многих случаях делает код как раз менее запутанным и понятным


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

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


Новичок
***
Награды: 1



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

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



JackYF

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


Цитата

goto  нарушает естественное течение программы, т.е. невызов нужных конструкторов/деструкторов, запутанность программ...



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

INHazeR

ну вот, сидеть мне теперь со словарём допозна... Единственное что я понял, что оператор теоретически безопасен (?).

MAKCim

 smile 

Это сообщение отредактировал(а) UniBomb - 14.12.2006, 21:14


--------------------
PM MAIL ICQ Skype   Вверх
apook
Дата 14.12.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Короче на сколько я понимаю этот оператор приводит к ошибкам программы
особенно если код большой а так же если кто-то захочет разобрать
твою прогу (дизассембл) то участок кода напр:
for(  ;; )
{
    ....
   for(  ;;  )
   {
        if( x <4 ) goto ass;
        }   
    }
Вроде-бы сведет на нет его понимание

но я иногда не брезгую хотя не очень он мне тоже нравится


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
MAKCim
Дата 14.12.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата

В таких случаях тоже низя? 

если код станет понятнее - однозначно можно
goto, повторюсь, это не табу


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

PM MAIL   Вверх
TaNK
Дата 14.12.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



goto необходимо использовать при самой необходимости, например когда невозможно использовать оператор break;

Это сообщение отредактировал(а) TaNK - 14.12.2006, 21:17


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
JackYF
Дата 14.12.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Unexpected returnvalue 2 from Glimpse - вот ответ на поиск 'goto' в тексте(ссылка Makcim'a). )))


Цитата(MAKCim @  14.12.2006,  21:08 Найти цитируемый пост)
чушь, что его нельзя использовать


Очень опасно. Особенно в С++.
Я лично на С ничего не пишу и не собираюсь.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 14.12.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



UniBomb
пример чего?


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

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


Новичок
***
Награды: 1



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

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



apook

Цитата

 а так же если кто-то захочет разобрать
твою прогу (дизассембл) то участок кода напр:


Допустим исходники только для твоих глаз, причём очень хорошо закоментирована.


--------------------
PM MAIL ICQ Skype   Вверх
INHazeR
Дата 14.12.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



если оператор в языке существует, значит использовать его можно и нужно, если того требует ситуация. другое дело, что я даже гипотетически не могу представить себе ситуацию, когда этот оператор был бы незаменим. гораздо проще и надежнее использовать условия и циклы. ИМХО.
PM MAIL   Вверх
UniBomb
Дата 14.12.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



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

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



MAKCim

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


--------------------
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 14.12.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата

Очень опасно. Особенно в С++.

Вообще, С++, если разобраться, очень опасный язык
Мое имхо, все, что к месту - хорошо, goto в том числе
ничего плохого в нем нет

Добавлено @ 21:24 
Цитата

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

Код

/* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
1072 static int fastcall do_path_lookup(int dfd, const char *name,
1073                                 unsigned int flags, struct nameidata *nd)
1074 {
1075         int retval = 0;
1076         int fput_needed;
1077         struct file *file;
1078 
1079         nd->last_type = LAST_ROOT; /* if there are only slashes... */
1080         nd->flags = flags;
1081         nd->depth = 0;
1082 
1083         if (*name=='/') {
1084                 read_lock(&current->fs->lock);
1085                 if (current->fs->altroot && !(nd->flags & LOOKUP_NOALT)) {
1086                         nd->mnt = mntget(current->fs->altrootmnt);
1087                         nd->dentry = dget(current->fs->altroot);
1088                         read_unlock(&current->fs->lock);
1089                         if (__emul_lookup_dentry(name,nd))
1090                                 goto out; /* found in altroot */
1091                         read_lock(&current->fs->lock);
1092                 }
1093                 nd->mnt = mntget(current->fs->rootmnt);
1094                 nd->dentry = dget(current->fs->root);
1095                 read_unlock(&current->fs->lock);
1096         } else if (dfd == AT_FDCWD) {
1097                 read_lock(&current->fs->lock);
1098                 nd->mnt = mntget(current->fs->pwdmnt);
1099                 nd->dentry = dget(current->fs->pwd);
1100                 read_unlock(&current->fs->lock);
1101         } else {
1102                 struct dentry *dentry;
1103 
1104                 file = fget_light(dfd, &fput_needed);
1105                 retval = -EBADF;
1106                 if (!file)
1107                         goto out_fail;
1108 
1109                 dentry = file->f_dentry;
1110 
1111                 retval = -ENOTDIR;
1112                 if (!S_ISDIR(dentry->d_inode->i_mode))
1113                         goto fput_fail;
1114 
1115                 retval = file_permission(file, MAY_EXEC);
1116                 if (retval)
1117                         goto fput_fail;
1118 
1119                 nd->mnt = mntget(file->f_vfsmnt);
1120                 nd->dentry = dget(dentry);
1121 
1122                 fput_light(file, fput_needed);
1123         }
1124         current->total_link_count = 0;
1125         retval = link_path_walk(name, nd);
1126 out:
1127         if (likely(retval == 0)) {
1128                 if (unlikely(current->audit_context && nd && nd->dentry &&
1129                                 nd->dentry->d_inode))
1130                 audit_inode(name, nd->dentry->d_inode, flags);
1131         }
1132 out_fail:
1133         return retval;
1134 
1135 fput_fail:
1136         fput_light(file, fput_needed);
1137         goto out_fail;
1138 }

просто пример из ядра, не скажу, однако, что тут без goto не обойтись


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

PM MAIL   Вверх
JackYF
Дата 14.12.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Вообщем, я уже 3 года обхожусь без goto.
По сему считаю, что его нужно применять только в случае крайней необходимости.

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

Это лично мое мнение, никому навязывать не собираюсь.




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

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

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

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

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


 




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


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

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