В вашем IMO с кодом goto
нет ничего плохого (я бы использовал больше подробных меток).
В этом случае написанные вами операторы goto
создают точно такую же структуру, что и реверс if
s.
То есть условный форвард goto
, который не покидает никакой области видимости, делает точно таким же , что и оператор if
без else
. Разница в том, что goto
случается , чтобы не покидать область действия, тогда как if
является ограниченным , чтобы не покидать область действия. Вот почему if
обычно легче читать: у читателя больше подсказок.
void *a = malloc (1);
if (a) {
void *b = malloc (1);
if (b) {
return 0; //normal exit
}
free(a);
}
return -1;
Для пары уровней это нормально, хотя если зайти слишком далеко, вы получите «код стрелки» со слишком большим количеством уровней отступа. Это становится нечитаемым по совершенно другим причинам.