Там нет ничего плохого goto
в и себя!
Это то, что большинство людей не в состоянии понять, а не просто попугай плохо выбранный фрагмент из бумаги данного десятилетия назад, тот, который сам Дейкстра позже пришел к сожалению, о том, что-то вдоль линий, имеющих «плохое чувство что люди делают из нее религию ».
Если бы люди просто пытаются понять причины руководящих принципов, таких как использование goto
, break
и continue
, или ограничение точек выхода из функций, и так далее, они были бы гораздо лучше, практикующие искусства.
Что Дейкстр фактически ругал, и то, что я согласен с беззаветно, было «необузданное использованием идти на заявление», в вычислительной среде, где было в основном мало что с точкой зрения итерации. Тот факт, что многие среды только имел goto
, может привести к большому количеству кодов спагетти, очень трудно следовать.
Я на самом деле считают слепой догматизм в отрасли гораздо больше проблем, чем goto
заявления никогда не были :-) Проблема с goto
является его злоупотребление, так, как уже упоминалось, это может сделать код намного труднее следовать, и что Я, как правило, делать, когда я слышу эти высказывания, это спросить:
ли этот код трудно следовать или поддерживать, потому что это нарушает «правила»?
Если вы реструктурировать свой код следующим образом:
// ===================================================
// Get the second number, disallowing zero if dividing.
getSecondNum:
printf ("Enter 2nd number: ");
scanf ("%d", &num2);
if ((o == '/') && (num2 == 0)) {
printf ("You can't divide by zero \n");
goto getSecondNum;
}
// ===================================================
вы бы трудно пытаться придумать решение, основанное do
или while
, который был более читаемым или понятно. Вы можете соответствовать читабельности, но вы часто обнаружите, что плохо выбранный выбор между нулем или более do
и один или более while
может отображать код less читаемый.
Для чего это стоит, это примерно так же близко, как я могу добраться до того же кода в не goto
-при образом:
// ===================================================
// Get the second number, disallowing zero if dividing.
do {
printf ("Enter 2nd number: ");
scanf ("%d", &num2);
if ((o == '/') && (num2 == 0)) {
printf ("You can't divide by zero \n");
} while ((o == '/') && (num2 == 0));
// ===================================================
но есть и другие проблемы, такие как дублирование кода. Это также может быть исправлено, но обычно это связано с использованием большего количества переменных или использованием break
, который имеет точно та же проблема, что и goto
здесь (b).
Таким образом, нижняя линия, сделать не взять как евангельскую то, что вы не понимаете, это не имеет значения, идет ли это от Дейкстры, Кнут, датских крон, или даже то, что другие боги вы можете верить в :-)
Подумайте о том, почему можно считать Евангелие в первую очередь, затем это, как вы решите, применяется ли он в той или иной ситуации (а).
Я часто использовать goto
в автоматах, обработка ошибок и так далее, там, где он на самом деле упрощает код, иначе было бы труднее понять.
(а) Это включает в себя советы от случайных людей в сети, даже из тех, кого называют "paxdiablo" :-)
(б) Одна вещь, вы мощь хотите, чтобы пользователь вводил ноль даже для деления, а затем просто сортировал его в расчете с чем-то вроде:
case '/':
if (num2 == 0)
printf ("%d/0 is undefined, cannot divide by zero", num1);
else
printf ("%d/%d = %d", num1, num2, num1/num2);
break;
Я бы предпочел бы уловить раньше, но это может быть жизнеспособным решением для вас.
Вы не должны удалять код и отвечать на любые вопросы – Gopi
См. [Goto по-прежнему считается вредным] (http://stackoverflow.com/questions/46586/goto-flowing-considered-harmful/) для обсуждения плюсы и минусы «goto» в целом. –
Вы должны проверить возвращаемое значение 'scanf', чтобы избежать неопределенного поведения и бесконечного цикла на EOF. – chqrlie