Этот пример C ++ является спорным:
if(a)
{
... // case 1
}
else if(b)
{
if(c)
{
... // case 1 again
}
else
{
... // case 2
}
}
else
{
... // case 3
}
Проблема здесь в том, что вы должны либо дублировать код в if()
для случая 1, либо вы должны продублировать код для обработки случая 1. ВВ этом примере код обработки был продублирован.Посмотрите это альтернативное решение no-goto:
if(a || (b && c))
{
... // case 1
}
else if(b && !c)
{
... // case 2
}
else
{
... // case 3
}
Кажется, хорошо, за исключением случаев, когда дублированный код является чем-то очень сложным.Затем вы начинаете вытаскивать вещи в промежуточные переменные ... перемещая логику от места, где это требуется.
Вот решение, использующее goto
, которое не имеет компромиссов:
if(a)
{
case1:
... // case 1
}
else if(b)
{
if(c)
{
goto case1;// case 1 again
}
else
{
... // case 2
}
}
else
{
... // case 3
}
В C ++ область действия - это то, что нужно учитывать.goto
в C ++ является почти единственным способом прыгал исполнение с либеральной точкой зрения сферы.
1016 * Даже если спорны, я все равно бы не использовать
goto
в образце я дал, потому что это усложняет порядоквыполнение.Знание положения вещей на
case1:
на самом деле не очень интуитивно понятно.