"Break;" aus "if" statement?
Können Sie brechen aus einer if-Anweisung oder wird es da zu Abstürzen führen? Ich fange an, vertraut zu machen mich mit C, aber dies scheint umstritten. Das erste Bild ist aus einem Buch über C
("Head First C") und das snippet zeigt code geschrieben von Harvard CS-Klassen-Personal. Was ist tatsächlich passiert und hat es etwas zu tun mit dem C-Normen?
bricht nicht brechen, wenn Sie Aussagen.
Am Januar 15, 1990, AT&T - Langstrecken-Telefon-system ist abgestürzt, und 60.000 Menschen verloren Ihr Telefon-service. Die Ursache ist? Ein Entwickler arbeitet an der C-code verwendet, in dem der Austausch versucht, eine
break
zu brechen, die aus einemif
- Anweisung. Aberbreak
s brechen nicht ausif
s. Stattdessen wird das Programm übersprungen, einen ganzen Abschnitt von code und führte ein bug, unterbrochen von 70 Millionen Telefonate über neun Stunden.
for (size = 0; size < HAY_MAX; size++)
{
//wait for hay until EOF
printf("\nhaystack[%d] = ", size);
int straw = GetInt();
if (straw == INT_MAX)
break;
//add hay to stack
haystack[size] = straw;
}
printf("\n");
InformationsquelleAutor der Frage Nick_Tsaftaridis | 2014-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
break
interagiert ausschließlich mit der nächsten einschließenden Schleife oder switch, ob es einfor
while
oderdo .. while
geben. Es wird Häufig bezeichnet als ein goto im Unglück, da alle loops in C kann in der Tat verwandelt sich in eine Reihe von bedingten gotos:Der Unterschied ist,
continue
undbreak
Interaktion mit virtuellen Etiketten automatisch durch den compiler. Dies ist ähnlich zu dem, wasreturn
hat, wie Sie wissen, es wird immer vor Sprung in das Programm fließen. Switches sind etwas komplizierter, Erzeugung von arrays von Etiketten und berechnete gotos, aber die Art und Weise brechen arbeitet mit Ihnen ist ähnlich.Den Fehler bei der Programmierung die Mitteilung bezieht, um Missverständnisse
break
Interaktion mit einem umschließenden block, anstatt einer umschließenden Schleife. Bedenken Sie:Jemand dachte, so ein Stück code, dass
G
verursachen würde, einen Sprung zuI
aber es springtJ
. Die beabsichtigte Funktion verwenden würdeif (!G) H;
statt.InformationsquelleAutor der Antwort Yann Vernier
Dies ist eigentlich die herkömmliche Nutzung der
break
- Anweisung. Wenn diebreak
Anweisung nicht verschachtelt in einemif
block derfor
- Schleife könnte immer nur ausführen Zeit.MSDN listet dies als Ihre Beispiel für die
break
- Anweisung.InformationsquelleAutor der Antwort Jonathan Mee
Ich denke, die Frage ist ein wenig unscharf - es kann beispielsweise interpretiert werden als eine Frage zu best practices in der Programmierung von Schleifen mit
if
im inneren. So, ich werde versuchen, diese Frage zu beantworten, mit dieser besonderen interpretation.Wenn Sie
if
innerhalb einer Schleife, dann in den meisten Fällen würden Sie gerne wissen, wie die Schleife beendet wurde - war es "gebrochen" durch dieif
oder war, endete er, "natürlich"? Also, dein Beispiel-code kann geändert werden, in dieser Weise:Das problem bei diesem code ist, dass die
if
Aussage ist begraben innerhalb der Schleife, und es dauert einige Mühe, um es zu suchen und zu verstehen, was es tut. Ein klarer (sogar ohne diebreak
- Anweisung) Variante:In diesem Fall können Sie deutlich sehen (Blick auf die Schleife "header"), dass diese Schleife kann vorzeitig beendet. Wenn die Schleife ist ein multi-page-text, geschrieben von jemand anderes, dann würde ich danke den Autor für das speichern Ihrer Zeit.
UPDATE:
Dank SO - es hat gerade vorgeschlagen, die bereits beantwortet Frage über den Absturz des AT&T Telefon-Netzwerk im Jahr 1990. Es geht um eine riskante Entscheidung von C Schöpfer ein einziges reserviertes Wort
break
verlassen die beiden Schlaufen und dieswitch
.Jedenfalls diese interpretation folgt nicht aus der Beispiel-code in der ursprünglichen Frage, also ich gehe meine Antwort, wie es ist.
InformationsquelleAutor der Antwort HEKTO
Wie bereits erwähnt, dass break-Anweisung funktioniert nur mit Schalter und Schleifen. Hier ist ein weiterer Weg, das zu erreichen, was verlangt wird. Ich bin reproduzieren
https://stackoverflow.com/a/257421/1188057 wie niemand sonst es erwähnt. Es ist nur ein trick mit der do-while-Schleife.
Obwohl ich würde es vorziehen, die Verwendung von goto-Anweisung.
InformationsquelleAutor der Antwort Abhinav