Во-первых, используйте goto
, например:
void something(void) {
// index through listA
for(int i = 0; i < alineno; i++){
// index through all the words in listB
for(int j = 0; j < blineno; j++){
if(strcmp(aline[i], bline[j]) == 0){
printf("%s is in the list!", bline[j]);
goto doneAnimal;
}
}
printf("%s is not in the list!", bline[i]);
doneAnimal: ;
}
}
Во-вторых;чтобы избежать риска глупости «goto is bad» (см. раздел «Историческая справка» ниже), усложните чтение кода, разбив его на 2 разные функции, чтобы можно было преобразовать goto
в return
, например так:
void something(void) {
// index through listA
for(int i = 0; i < alineno; i++){
doAnimal(i, blineno);
}
}
void doAnimal(int i, int blineno) {
for(int j = 0; j < blineno; j++){
if(strcmp(aline[i], bline[j]) == 0){
printf("%s is in the list!", bline[j]);
return;
}
}
printf("%s is not in the list!", bline[i]);
}
Историческая справка
Когда-то языки более высокого уровня (например, ассемблер) не имели функций структурированного программирования (do
, while
,break
, continue
, switch
, ...). Вместо этого программисты писали бы код, используя goto
, например (например) "if(x < MAX) goto loopStart;
вместо" } while(x < MAX);
.
Чтобы поощрить принятие функций структурированного программирования, в 1968 году Эдсгер В. Дейкстра написал письморедактору ACM под названием «перейти к заявлению, признанному вредным». Это письмо имело желаемый эффект - функции структурированного программирования (do
, while
, break
, continue
, switch
, ...) были приняты на всех основных языках.
Однако;у него также был один непреднамеренный побочный эффект - письмо было слишком эффективным;и невежественные люди (которые не смогли прочитать письмо или понять его контекст) стали ревнителями, ухудшили свой код (для случаев, когда новых возможностей структурированного языка недостаточно), чтобы избежать перехода, не понимая, почему, и поощряя других людей делать этоих код хуже, не понимая почему.
Примеры этого включают усложнение кода путем введения дополнительных переменных исключительно ради того, чтобы избежать более простого goto
, и / или усложнение кода для введения дополнительных ветвей исключительно ради избежанияболее простой goto
.
позже (в беседах с Дональдом Э. Кнутом);Сам Дейкстра сказал: « Пожалуйста, не попадитесь в ловушку веры в то, что я ужасно догматичен в отношении [перехода к утверждению]. У меня неприятное ощущение, что другие делают из этого религию Как будто концептуальные проблемы программирования могут быть решены одним трюком, простой формой кодирования!"
Печально;как только невежество начинает распространяться, здравый смысл вступает в проигрышную битву.