Vorwort
Die goto-Anweisung wird auch als unbedingte Übertragungsanweisung bezeichnet. Ihre Grundform ist wie folgt:
Die Anweisungsbezeichnung besteht aus einem gültigen Bezeichner und dem Symbol „; ", wobei die Benennungsregeln für Bezeichner dieselben sind wie für Variablennamen, d. h. sie bestehen aus Buchstaben, Zahlen und Unterstrichen, und das erste Zeichen muss ein Buchstabe oder Unterstrich sein. Nach der Ausführung der goto-Anweisung springt das Programm zur Anweisungsbezeichnung und führt die nachfolgenden Anweisungen aus.
Normalerweise werden goto-Anweisungen in Verbindung mit if-Bedingungsanweisungen verwendet. Obwohl die goto-Anweisung dem Programm Flexibilität verleiht, macht sie die Programmstruktur jedoch auch unklar und schwer lesbar, sodass sie verwendet werden muss rational diese Aussage.
Problem gefunden
Wir stoßen oft auf das Problem, Variablen nach goto zu definieren, aber die Kompilierung unter Linux gelingt nicht (Fehlermeldung: Crosses initialization). von). Eigentlich muss man einfach aufpassen. Nachdem ich heute die Vorgesetzten im Unternehmen gefragt habe, habe ich mir auch einige Informationen angesehen und sie aufgezeichnet, um mein Gedächtnis zu vertiefen. Ich hoffe, dass sie einigen Menschen helfen können.
Fehlerbeispielcode:
#include <iostream> using namespace std; int main() { goto Exit; int a = 0; Exit: return 0; }
Fehlerbericht:
[root@localhost c-c++]# g++ goto_study.cpp goto_study.cpp: In function 'int main()': goto_study.cpp:31: error: jump to label 'Exit' goto_study.cpp:29: error: from here goto_study.cpp:30: error: crosses initialization of 'int a'
Korrekt Man kann nicht sagen, dass das Schreiben
die richtige Schreibweise ist, man kann nur sagen, dass es die Schreibweise ist, die in Ordnung ist.
Geben Sie den Code direkt ein:
Schreibmethode eins:
Ändern Sie die Domäne und werden Sie eine lokale Variable:
int main() { goto Exit; { int a = 0; } Exit: return 0; }
Schreibmethode zwei
Magische Schreibmethode:
int main() { goto Exit; int a; a = 1; Exit: cout << "a = " << a << endl; return 0; }
Der Schlüssel ist, dass Sie immer noch darauf zugreifen können ! Ergebnis:
[root@localhost c-c++]# g++ goto_study.cpp [root@localhost c-c++]# ./a.out a = 1259648
Forschung über die magische Schreibmethode von
Nachdem ich zwei Schreibmethoden gesehen habe, die sein können kompiliert und übergeben. Das Rätselhafteste ist, dass die zweite Methode kompiliert und verwendet werden kann und trotzdem verwendet werden kann? ? ?
C++-Vorschriften
Referenz [1][2] erwähnt die Vorschriften im C++-Standard: > Es ist möglich, in einen Block zu übertragen, aber nicht auf eine Weise, die Deklarationen mit Initialisierung umgeht. Ein Programm, das springt von einem Punkt, an dem keine lokale Variable mit automatischer Speicherdauer vorhanden ist Der Gültigkeitsbereich bis zu einem Punkt, an dem er sich im Gültigkeitsbereich befindet, ist falsch formatiert, es sei denn, die Variable verfügt über POD Typ (3.9) und wird ohne Initialisierer deklariert.
bedeutet: wenn der Ausführungspfad eines Programms von Punkt A im Code (eine lokale Variable x wurde nicht definiert) zu einem anderen Punkt B im Code springt (Die lokale Variable x wurde definiert und beim Definieren initialisiert), dann meldet der Compiler einen Fehler. Ein solcher Sprung kann durch die Ausführung einer goto-Anweisung oder eines Switch-Case verursacht werden. Daher ist a bei der zweiten Schreibweise vom Typ int, einem POD-Typ, und wurde nicht initialisiert, sodass die Kompilierung erfolgreich ist. Es ist jedoch offensichtlich: Wenn Sie diese Variable a verwenden, ist das Ergebnis unbekannt. Wie der Vorgänger sagte, ist es bedeutungslos, es ist besser, es nicht zu unterstützen! Wenn es nur lokal verwendet wird, kann es in geschweifte Klammern eingeschlossen werden! Einige Leute im Internet sagten auch, dass die C++-Spezifikation zwar nicht explizit feststellt, dass dies falsch ist, die Bestimmungen der Variablendomäne jedoch implizit sagen, dass dieser Ansatz nicht ratsam ist, siehe Referenz [4].
Implizite Beschreibung
Goto kann Definitionen von Variablen nicht überspringen, da diese Variablen dies tun würden
existiert nach dem Sprung nicht mehr, da die Lebensdauer der Variablen an der Stelle von beginnt
Definition scheint goto nicht explizit zu erwähnen
Tun Sie das, aber es ist in dem, was über die Lebensdauer von Variablen gesagt wird, impliziert. Ja, Sie können dieses Flag des Compilers so setzen, dass es in eine Warnung umgewandelt wird, aber das wird nicht praktiziert! ! !
POD-Typ
#include <iostream> using namespace std; class A{ public: // 注意:和B不同的是有构造和析构函数, 所以编译报错 A(){} ~A(){} void testA(){ cout << "A::test." << endl; } }; class B{ public: void testB(){ cout << "B::test." << endl; } }; int main() { goto Exit; // int a = 1; // windows ok.linux failed! //A classA; // failed: B classB; // success: classB.testB(); Exit: classB.testB(); return 0; }
1. Der obige Code wird sowohl unter Windows als auch unter Linux kompiliert und ausgeführt
[root@localhost c-c++]# g++ goto_study.cpp [root@localhost c-c++]# ./a.out a = 1259648 B::test.
Das Folgende sind POD-Typen (lesen wir auf Englisch):
4. Die konstanten und gewöhnlichen Variablen von POD sind ebenfalls gleich.
5. Das Gleiche gilt für die POD-Typen class, struct und union. Alle Mitglieder müssen jedoch öffentlich sein, und es gibt keine Basisklasse, keinen Konstruktor, Destruktor und keine virtuelle Funktion. Auch statische Mitglieder unterliegen diesen Regeln.
Zusammenfassung
1. Es ist am besten, goto nicht zu verwenden;
2. Überspringen Sie nicht die Definition und Initialisierung von Variablen nach goto. Wenn es sich um einen POD-Typ handelt, können Sie ihn zuerst deklarieren und dann definieren. Es wird kein Kompilierungsfehler gemeldet. Es wird jedoch nicht empfohlen, es auf diese Weise zu verwenden. Sie können sehen, dass der Wert der Variablen unbekannt und gefährlich ist. 3. Wenn danach eine lokale Variable vorhanden ist goto, Sie können geschweifte Klammern verwenden. Es ist sicher, es einzuschließen, um eine lokale Domäne zu bilden.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels jedem beim Lernen oder Arbeiten helfen kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.
Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!