Здравствуйте, Rackshas, Вы писали:
R>goto-ненавистники, как вот такой код R>
R>void HZ()
R>{
R> if(!init1()) goto d1;
R> if(!init2()) goto d2;
R> if(!init3()) goto d3;
я так понимаю тут еще какой то код должен быть...
R>d3:
R> destroy3();
R>d2:
R> destroy2();
R>d1:
R> destroy1();
R>}
R>
R>Избавить от goto?
Лехко!
void HZ()
{
if (init1())
{
if(init2())
{
if(init3())
{
какой то код
}
destroy3();
}
destroy2();
}
destroy1();
}
или же для противников синтаксического оверхеда
void HZ()
{
if (init1()) {
if (init2()) {
if (init3()) {
какой то код
}destroy3();
}destroy2();
}destroy1();
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Rackshas, Вы писали:
R>goto-ненавистники, как вот такой код
[skip] R>Избавить от goto?
А зачем? Тебя устраивает как работает? — если да, то менять не надо. Хотя если этот код выполняет то, что я думаю (слишком мало информации) я бы написал так:
Здравствуйте, Timurka, Вы писали:
T>Здравствуйте, Rackshas, Вы писали:
R>>goto-ненавистники, как вот такой код T>[skip] R>>Избавить от goto?
T>А зачем? Тебя устраивает как работает? — если да, то менять не надо. Хотя если этот код выполняет то, что я думаю (слишком мало информации) я бы написал так: T>
Хрен это а не наглядней. Если уровень вложенности будет больше трех — устанешь читать.
В данном случае, это мое сугубо имхо — такой подход доупустим на все 200%. Естествено мы полгаем, что это С. а не С++.
Если интресуют большие подробности, то могу показать код, где это применяется на полную катушку
(код указанный выше) — ралдости от его использования ни на грош
На С++ это делается с помощью scope-guard'ов.
На С — можно наветвить условий. Кстати, если условий слишком много — не повод ли это задуматься о рефакторинге?
На ассемблере от goto вообще никуда не деться (что вы скажете, готоненавистники?) Хотя есть архитектуры, где деться можно — MIPS, кажется.
void YaZnayu()
{
int n = 2;
if(!init1()) n = 0;
else if(!init2()) n = 1;
else if(!init3()) n = 2;
switch(n)
{
case 2: destroy3();
case 1: destroy2();
case 0: destroy1();
}
}
R>
Здравствуйте, Rackshas, Вы писали:
R>goto-ненавистники, как вот такой код R>
Честно говоря — такой код просто кошмарно выглядит.
При этом код еще и неверен. Например при если init2 отработает неверно то должны вызваться destroy2 и destroy1...
+ еще нет вызовов destroyX в случае когда все initX отработали правильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
CC>Честно говоря — такой код просто кошмарно выглядит. CC>При этом код еще и неверен. Например при если init2 отработает неверно то должны вызваться destroy2 и destroy1... CC>+ еще нет вызовов destroyX в случае когда все initX отработали правильно.
void HZ(){
int flag=0;
flag+=init1()?1:0+init2()?2:0+init3()?4:0;
switch(flag){
case 7:
case 6:
case 5:
case 4:destroy3();
case 3:
case 2:destroy2();
case 1:destroy1();break;
case 0://TODO...
}
}
void HZ(){
int flag=0;
for(int i=0;i<3;i++){
if(flag)
continue;
switch(i){
0:flag+=init1()?1:0;break;
1:flag+=init2()?2:0;break;
2:flag+=init3()?4:0;break;
}
}
switch(flag){
case 7:
case 6:
case 5:
case 4:destroy3();
case 3:
case 2:destroy2();
case 1:destroy1();break;
case 0://TODO...
}
}