2 Stimmen

Unvollendete Codeschnipsel

Kann mir bitte jemand den Unterschied zwischen den beiden folgenden Codeschnipseln erklären?

//Code snippet A: Compiles fine
int main()
{
    if(int i = 2)
    {
        i = 2 + 3;
    }
    else
    {
        i = 0;
    }
}

//Code Snippet B: Doesn't compile :(
int main()
{
    if((int i = 2))
    {
        i = 2 + 3;
    }
    else
    {
        i = 0;
    }
}

Wie Sie sehen, ist der Unterschied nur eine zusätzliche Klammer bei der if-Anweisung. Ich benutze g++ compiler.error ist "erwartet primäre-Ausdruck vor âintâ"

18voto

paxdiablo Punkte 809679

In Abschnitt 6.4 des C++-Standards (Entwurf n2914 von c++0x) heißt es über das Format von if Erklärungen:

Selektionsanweisungen wählen einen von mehreren Kontrollströmen aus.
   selection-statement:
      if ( condition ) statement
      if ( condition ) statement else statement
      switch ( condition ) statement
   condition:
      expression
      type-specifier-seq attribute-specifieropt declarator = initializer-clause
      type-specifier-seq attribute-specifieropt declarator braced-init-list

Das Bit am Ende bedeutet, dass eine Bedingung entweder ein Ausdruck sein kann oder ein Konstrukt vom Typ Dekalarator.

Und in dem Moment, in dem der Parser auf die zweite Klammer stößt, wird es zu einem Ausdruck, also sind leider keine Deklarationen erlaubt.

Der Schnipsel:

if (int i = 2) { ... } else { ... }

ist vollkommen gültiges C++, in dem der Abschnitt if eine ganze Zahl definiert i für die Dauer der if/else und setzt ihn auf 2. Anschließend wird diese 2 als Eingabe für die if (2 ist immer wahr, da es nicht Null ist).

Der Schnipsel if((int i = 2)) ist syntaktisch nicht anders als int x = (int i = 2;); if (x) das ist no gültiges C++.

10voto

Mike Seymour Punkte 242473

Schnipsel A ist in Ordnung - die if wird eine Variable, die als Boolescher Wert interpretiert werden kann, definiert und initialisiert. Die Variable wird innerhalb der if und jede else Blöcke.

Ausschnitt B ist falsch, weil man keine Klammern um eine Erklärung setzen kann, sondern nur um Ausdrücke. Das Folgende ist aus demselben Grund ebenfalls falsch:

int main()
{
    int i;       // OK
    (i = 2);     // OK

    (int x = 2); // compile error
}

5voto

Roman Nikitchenko Punkte 12374

Hier ist eine weitere Variante des zweiten Schnipselfehlers:

int main()
{
    int i = (int j = 0);
    return 0;
}

Sie können keine Variablen innerhalb EINES Ausdrucks deklarieren. Das zweite () innerhalb von for ist der gleiche Fall - Sie können die Variable i innerhalb von for() deklarieren, aber nicht innerhalb eines verschachtelten Ausdrucks, der in () platziert ist.

Ich hoffe, ich habe es richtig erklärt, vielleicht gibt es ja eine bessere Erklärung. Eigentlich sind beide Codefragmente merkwürdig.

1voto

John Carter Punkte 52192

Beides sieht falsch aus.

Nur weil ein Code kompilierbar ist, heißt das nicht, dass er gültig ist. Ich bin überrascht, dass der erste Fall kompiliert wird, da es scheint, dass i ist im Fall else nicht definiert.

edit: Hier liege ich falsch, Definitionen in der if Bedingung gelten für die gesamte if / else Erklärung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X