- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
void funcMir()
{
...
if ( __mir0>5 )
goto vihod;
TMir1 __mir1; // Конструктор не вызывается. (Оператор goto перескакивает через него.)
...
vihod:
...
// Здесь вызывается деструктор для __mir1 при выходе __mir1 из области видимости.
};
guest 06.09.2009 12:55 # 0
guest 06.09.2009 16:56 # +1
viktorious 06.09.2009 19:38 # −1
guest 06.09.2009 22:25 # 0
неужели кто-то думает, что в плюсовых компайлерах
остался бы такой баг и был "случайно" каким-то нубом?
guest 07.09.2009 01:50 # 0
viktorious 07.09.2009 10:19 # 0
jump to label ‘vihod’ from here crosses initialization of ‘TMir1 __mir1’
Так что это не говнокод, а ошибочный код.
guest 07.09.2009 11:29 # 0
viktorious 07.09.2009 15:18 # 0
guest 08.09.2009 01:16 # 0
guest 07.09.2009 12:47 # +1
guest 08.09.2009 01:31 # 0
guest 07.09.2009 11:29 # 0
guest 07.09.2009 12:55 # 0
Вопрос для начала: как без goto делать break из вложенниго цикла?
guest 07.09.2009 12:59 # 0
guest 07.09.2009 13:07 # 0
Есть три вложенных цикла. В зависимости от обстоятельств надо делать выход из среднего или внешнего. Как?
guest 07.09.2009 13:21 # 0
Это если уж решительно идти без goto.
guest 07.09.2009 13:35 # 0
while(...) {
...
while(...) {
...
while(...) {
...
if(...)
goto endmiddle;
else
goto endouter;
...
}
...
}
endmiddle:
...
}
endouter:
Если goto на помойку, то как это переписать без значительного усложнения?
guest 07.09.2009 13:39 # 0
очень просто - вообще не писать такое
три вложенных цикла - говнокод по определению
зы. я - другой guest, если что
guest 07.09.2009 13:47 # 0
{
while( ... )
{
while( ... )
{
if( ... )
return END_MIDDLE;
else
return END_OUTER;
}
}
return END;
}
...
while(...)
{
int Res = Func( ... );
if( Res == END_OUTER )
break;
}
...
Вроде бы усложениния не такие значительные. Мм?
guest 07.09.2009 14:09 # 0
guest 07.09.2009 17:31 # 0
goto часто сильно усложняет процесс разбора и поддержку кода.
всегда можно написать без него. приведите, плиз, реальный пример, когда goto необходим, ибо три вложенных цикла с неясными условиями завершения - шибко надумано, да и в них можно без него.
xaionaro 10.11.2009 18:52 # 0
guest 07.09.2009 17:33 # 0
хотя он более Си-ориентированный
void func( /*тут гдет 10 аргументов, поинтеры на различные структуры*/)
{
some_type val = init_by_arg1(arg1);
if(val)
{
cleanup(arg1);
}
//....... и так со всеми
some_action_with_some_val( val_9 );
// и потом очитка
}
надеюсь понятно проблему?
в плюсах бы решалось написанием классов с детрукторами, но тоже не всегда удобно, если нужные функции портируются из Сишных либ
guest 08.09.2009 12:03 # 0
а это и есть раздел про плюсы
> но тоже не всегда удобно, если нужные функции портируются из Сишных либ
а в чем проблема?
приведенный код - не более, чем плохое проектирование, как мне отсюда кажется
xaionaro 10.11.2009 18:53 # 0
guest 13.09.2009 17:58 # 0
guest 08.09.2009 01:30 # 0
Мне кажется, что goto - незаменим в некоторых случаях. Все другие методы в ЭТИХ случаях только ухудшают читабильность и уменьшают скорость исполнения программы.
guest 08.09.2009 01:46 # 0
guest 08.09.2009 03:40 # 0
bool func()
{
...
if (ошибка)
{
//делаем ряд действий
return false;
}
//и этот блок встречается еще не раз
}
ИМХО лучше поставить в конце функции метку и переходить туда в случае ошибки
guest 08.09.2009 12:04 # 0
guest 09.09.2009 12:50 # 0
а если без них то берем переменную int stage = 0; после каждого шага наращиваем, если произошла ошибка, то загоняем эту переменную в switch и выполняем действия обратные сделанным.
пример
int stage = 0;
ptr1 = new Obj1();
error = ptr1 == NULL;
if (!error)
{
stage++;
ptr2 = new Obj2();
error = ptr2 == NULL;
if (!error)
{
stage ++;
.............
}
}
.....
if (error)
{
switch(stage)
{
case 2:
delete ptr2;
case 1:
delete ptr1;
}
}
то есть goto я бы не использовал ни при каких обстоятельствах, и еще ниразу не встречал код который нельзя переписать без goto
guest 09.09.2009 13:23 # 0
guest 09.09.2009 13:50 # 0
Никто не встречал и не встретит.
Идея структурного программирования как раз и основана на том, что любой алгоритм можно закодировать в виде комбинации последовательного выполнения, ветвления и цикла. Это давно доказано, и не надо изобретать вечный двигатель. Но вопрос в другом: действительно ли оправдан отказ от goto.
guest 09.09.2009 17:30 # +1
если бы от него отказались, то не было бы такого keyword'a :)
пользуйтесь наздоровье и надейтесь, что это не выйдет боком впоследствии.
к счастью, в промышленном коде - goto редкостная редкость.
зато в говноопенсорсе часто вижу :( в общем, как и хреновое форматирование и имена переменных вида s, ss, a, b и иже с ними.
guest 09.09.2009 18:02 # 0
В джаве нет оператора goto, но есть ключевое слово goto
Видимо, создатели сами не были уверены в успехе отказа :)
guest 29.09.2009 15:06 # 0
а в проприетарщине и не увидишь
guest 16.12.2009 00:26 # 0
есть мнение, что именно гоу ту и делают циклы
guest 10.09.2009 00:19 # 0
случайно не так:
try
{
if(!val)
{
// ...............
throw 1;
}
/// do some
if(!val2)
{
// ...............
throw 2;
}
//.............
}
catch
{
//some cleanup
}
(:
guest 10.09.2009 09:00 # 0
еще ужаснее, чем предыдущий пример.
и медленнее.
вообще это неправильное использование exceptions :)
ElWray 10.09.2009 10:50 # 0
guest 16.12.2009 00:27 # 0
guest 22.09.2009 17:51 # 0
для обработки ошибок и их последствий есть авто-птр, деструкторы, эксепшны, функции, но гото практически всегда наводит на мысль о кривости кода :)
viktorious 08.09.2009 11:50 # 0
Конечно, лучше максимально избегать использования goto - рефакторить код и т.д.
guest 10.09.2009 20:43 # +3
Иногда приходится его использовать в очень сложных случаях (опять же, например, когда используются макросы va_start и т.д. Функции не вызовешь, а то стек попортится...)
Короче, кто за гото - тот долбоёб, кто против гото - тот тоже долбоёб.
guest 24.09.2009 18:44 # −1