Semikolon in C++?

Lesezeit: 6 Minuten

Benutzer-Avatar
SysAdmin

Ist der Fehler „fehlendes Semikolon“ wirklich erforderlich? Warum sollte man es nicht als Warnung betrachten?

Wenn ich diesen Code kompiliere

int f = 1
int h=2;

Der Compiler sagt mir intelligent, wo ich es vermisse. Aber für mich ist es so: „Wenn du es kennst, behandle es einfach so, als ob es da wäre, und mach weiter. (Später kann ich die Warnung korrigieren.)

  int sdf = 1, df=2;
  sdf=1 df =2

Auch für diesen Code verhält es sich gleich. Das heißt, selbst wenn mehrere Anweisungen (ohne 😉 in derselben Zeile stehen, weiß der Compiler Bescheid.

Warum also nicht einfach diese Anforderung streichen? Warum nicht so verhalten Python, Visual Basicetc.

Zusammenfassung der Diskussion

Zwei Beispiele/Instanzen fehlten, und ein Semikolon würde tatsächlich ein Problem verursachen.

1.

return
 (a+b)

Dies wurde als einer der schlimmsten Aspekte von JavaScript dargestellt. Aber in diesem Szenario ist das Einfügen von Semikolons ein Problem für JavaScript, aber nicht für C++. In C++ erhalten Sie einen weiteren Fehler, wenn ; Das Einfügen erfolgt nach der Rückkehr. Das heißt, ein fehlender Rückgabewert.

2

int *y;
int f = 1
*y = 2;

Dafür gibt es meiner Meinung nach keinen besseren Weg, als als Anweisungstrennzeichen einzuführen, also a Semikolon.

  • Python und VB sind genau wie C++, aber anstatt nur Semikolons zum Trennen von Anweisungen zu verwenden, verwenden sie Zeilenumbrüche, was dazu führt, dass Zeilenfortsetzungszeichen erforderlich sind.

    – kennytm

    5. Mai 2010 um 7:32 Uhr

  • “Später kann ich die Warnung beheben” – Ich liebe das :). Ich kann nicht zählen, wie viele solche Späters habe ich gesehen, die nie behoben wurden (nicht nur über Programmierung)

    – Alexander Malachow

    5. Mai 2010 um 9:18 Uhr

  • @Alexander Malakhov – Ich stimme zu

    – SysAdmin

    5. Mai 2010 um 9:23 Uhr

  • @Alexander Markieren Sie es einfach mit // TODO Fix Warnung 🙂

    – Daniel Daranas

    5. Mai 2010 um 9:37 Uhr

  • @Daniel: Das wäre die perfekte Lösung für fehlende Semikolons. lol 🙂

    – Alexander Malachow

    5. Mai 2010 um 9:44 Uhr


Es ist sehr Gut, dass der C++-Compiler dies nicht tut. Einer der schlechteste Aspekte von JavaScript ist die Semikolon-Einfügung. Stell dir das vor:

return
  (a + b);

Der C++-Compiler fährt wie erwartet problemlos in der nächsten Zeile fort, während eine Sprache, die Semikolons „einfügt“, wie JavaScript, dies als „return;“ behandelt. und das “(a + b);” auslassen.

Anstatt sich auf die Fehlerbehebung des Compilers zu verlassen, machen Sie es sich zur Gewohnheit, Semikolons zu verwenden.

  • +1 Es ist immer eine gute Programmierpraxis, Ihre Absichten so explizit wie möglich zu machen. Verlassen Sie sich nicht darauf, dass Ihre Tools dies für Sie tun.

    – Sharpie

    5. Mai 2010 um 7:32 Uhr

  • Das Javascript-Beispiel ist auch das erste, das mir in den Sinn kam.

    – Steve Rowe

    5. Mai 2010 um 7:34 Uhr

  • Warum also nicht ein Zeilenfortsetzungszeichen wie _ hinzufügen, wie es in anderen Sprachen der Fall ist

    – SysAdmin

    5. Mai 2010 um 7:38 Uhr

  • @SysAdmin: Dann müssten Sie überall Zeilenfortsetzungszeichen hinzufügen, und wenn Sie sie vergessen hätten, würde Ihr Code immer noch korrekt kompiliert, aber nicht das tun, was Sie erwartet hätten.

    – JoG

    5. Mai 2010 um 7:42 Uhr

  • @SysAdmin Weil C++ nicht diese anderen Sprachen ist. Es hat eine sehr gut definierte Semantik, auf die sich die Menschen verlassen können.

    – Daniel Daranas

    5. Mai 2010 um 7:44 Uhr

Es gibt viele Fälle, in denen ein Semikolon benötigt wird.

Was wäre, wenn Sie Folgendes hätten:

int *y;
int f = 1
*y = 2;

Dies würde analysiert werden als

int *y;
int f = 1 * y = 2;

Ohne die Semikolons ist es also mehrdeutig.

  • Das ist nicht zweideutig, es ist einfach falsch. Sie können nicht multiplizieren int mit einem Zeiger, und ein Terminal kann kein Lvalue sein.

    – wilhelmtel

    5. Mai 2010 um 7:40 Uhr


  • Es gibt andere Beispiele, die man sich einfallen lassen könnte, die nicht zu Fehlern führen würden. int x = y * z--

    – Dennis Zickefoose

    5. Mai 2010 um 7:44 Uhr

  • Ich mag diese Antwort mehr, weil es anscheinend nichts gibt, was in der Syntax getan werden kann, um dies zu lösen.

    – SysAdmin

    5. Mai 2010 um 7:49 Uhr

  • Denken Sie, dass der Programmierer einen Fehler gemacht hat und der Compiler es bemerkt hat. Kann der Compiler erraten, dass der Programmierer a übersehen hat ;? Was ist, wenn der Programmierer etwas anderes übersehen hat (* könnte oben passen)? Der Compiler weiß, dass Sie einen Fehler gemacht haben, aber er kann unmöglich wissen, was Sie tun wollten.

    – David Rodríguez – Dribeas

    5. Mai 2010 um 7:54 Uhr

  • +1 Zur Veranschaulichung, dass der Compiler nicht immer feststellen kann, was Sie wirklich gemeint haben, und in diesem Fall ist es sinnlos, manchmal zu raten.

    – Markus B

    5. Mai 2010 um 14:54 Uhr

Dies ist zunächst nur ein kleines Beispiel; Sind Sie sicher, dass der Compiler Ihnen intelligent sagen kann, was bei komplexerem Code falsch ist? Zum irgendein Stück Code? Könnten alle Compiler dies auf die gleiche Weise intelligent erkennen, sodass ein Stück C++-Code mit fehlenden Semikolons garantiert portierbar wäre?

Zweitens wurde C++ vor mehr als einem Jahrzehnt entwickelt, als die Rechenressourcen noch lange nicht das waren, was sie heute sind. Auch heute können Builds eine beträchtliche Zeit in Anspruch nehmen. Semikolons helfen dabei, verschiedene Befehle klar abzugrenzen (für den Benutzer und für den Compiler!) und helfen sowohl dem Programmierer als auch dem Compiler zu verstehen, was passiert.

; dient der Bequemlichkeit des Programmierers. Wenn die Codezeile sehr lang ist, können wir die Eingabetaste drücken und zur zweiten Zeile gehen, weil wir haben ; für Linientrenner. Es sind Programmierkonventionen. Es muss ein Zeilentrenner vorhanden sein.

Das Vorhandensein von Semikolons (oder Zeilenumbrüchen, wählen Sie eines aus) macht den Compiler erheblich einfacher und Fehlermeldungen lesbarer.

Aber im Gegensatz zu dem, was andere Leute gesagt haben, ist keine Form von Trennzeichen (als absolut) unbedingt erforderlich.

Betrachten Sie zum Beispiel Haskell, das beides nicht hat. Auch die aktuelle Version von VB erlaubt Zeilenumbrüche an vielen Stellen innerhalb einer Anweisung, ebenso wie Python. Beides erfordert an vielen Stellen keine Linienfortsetzungen.

Beispielsweise erlaubt VB jetzt den folgenden Code:

Dim result = From element in collection
             Where element < threshold
             Select element

Keine Anweisungstrenner, keine Zeilenfortsetzungen und doch keinerlei Mehrdeutigkeiten.

Theoretisch könnte dies noch viel weiter getrieben werden. Alle Mehrdeutigkeiten können beseitigt werden (siehe wieder Haskell), indem einige Regeln eingeführt werden. Aber auch das macht den Parser viel komplizierter (er muss an vielen Stellen kontextsensitiv sein, z return Beispiel, das nicht aufgelöst werden kann, ohne zuerst den Rückgabetyp der Funktion zu kennen). Und wieder wird es viel schwieriger, aussagekräftige Diagnosen auszugeben, da ein fehlerhafter Zeilenumbruch mehrere Dinge bedeuten kann, die der Compiler nicht wissen kann welcher Fehler der Benutzer gemacht hat, und nicht einmal wo der Fehler wurde gemacht.

Benutzer-Avatar
Boschidar Batsov

In C-Programmen sind Semikolons Anweisungsterminatoren, keine Trennzeichen. Vielleicht möchten Sie lesen dieser lustige Artikel.

Benutzer-Avatar
ChrisBD

+1 für euch beide.

Das Semikolon ist ein Befehlszeilentrennzeichen, im Gegensatz zu VB, Python usw. C und C++ ignorieren Leerzeichen innerhalb von Codezeilen, einschließlich Wagenrückläufen! Dies lag ursprünglich daran, dass Computermonitore zu Beginn von C nur 80 Zeichen Text verarbeiten konnten und C++ auf der C-Spezifikation basiert, folgte es diesem Beispiel.

Ich könnte die Frage stellen: “Warum muss ich immer wieder Fehler wegen fehlender \-Zeichen in VB bekommen, wenn ich versuche, Code über mehrere Zeilen zu schreiben, sicher, wenn VB das Problem kennt, kann es es einfügen?”

Wie bereits erwähnt, kann das automatische Einfügen ein Albtraum sein, insbesondere bei Code, der in eine zweite Zeile umbricht.

1366460cookie-checkSemikolon in C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy