C-Fehler: Erwarteter Ausdruck vor int

Lesezeit: 3 Minuten

Benutzeravatar von MsPillai
Frau Pillai

Wenn ich den folgenden Code ausprobiert habe, bekomme ich den genannten Fehler.

if(a==1)
  int b =10;

Aber das Folgende ist syntaktisch korrekt

if(a==1)
{
   int b = 10;
}

Warum ist das?

  • Poste deinen Fehler. Ihr Code ist einsatzbereit, es sei denn, Sie greifen auf “b” außerhalb des Bereichs zu.

    – Abhineet

    15. März 2014 um 5:13 Uhr

  • Ich habe den Fehler in der Überschrift erwähnt. Auch wenn b an keiner anderen Stelle im Code verwendet wird, tritt der Fehler weiterhin auf.

    – MsPillai

    15. März 2014 um 5:17 Uhr


  • Außerdem gibt es einige Unterschiede zwischen C und C++, die am besten gelöst werden, indem Sie direkt zur Dokumentation gehen. Überprüfen Sie meine Antwort bzgl while Schleife, in der ich mit demselben Kompilierungsfehler gerungen habe.

    – Lebensbalance

    10. Mai 2015 um 18:27 Uhr

sheus Benutzeravatar
schau

Das ist eigentlich eine ziemlich interessante Frage. Es ist nicht so einfach, wie es zunächst aussieht. Als Referenz werde ich dies auf der neuesten C11-Sprachgrammatik basieren, die in definiert ist N1570

Ich denke, der kontraintuitive Teil der Frage ist: Wenn das richtig ist C:

if (a == 1) {
  int b = 10;
}

warum ist das dann nicht auch richtiges C?

if (a == 1)
  int b = 10;

Ich meine, eine einzeilige Bedingung if Aussage sollte entweder mit oder ohne geschweiften Klammern in Ordnung sein, oder?

Die Antwort liegt in der Grammatik des if Anweisung, wie durch den C-Standard definiert. Die relevanten Teile der Grammatik habe ich unten zitiert. Kurz: Die int b = 10 Linie ist ein Erklärungkein Aussageund die Grammatik für die if Anweisung erfordert eine Anweisung nach der Bedingung, dass es sich um einen Test handelt. Aber wenn Sie die Deklaration in geschweiften Klammern einschließen, wird sie zu einer Aussage und alles ist gut.

Und nur um die Frage vollständig zu beantworten – das hat nichts mit dem Umfang zu tun. Das b Variable, die innerhalb dieses Gültigkeitsbereichs existiert, ist von außerhalb nicht zugänglich, aber das Programm ist immer noch syntaktisch korrekt. Genau genommen sollte der Compiler keinen Fehler darauf werfen. Natürlich sollte man mit bauen -Wall -Werror Sowieso 😉

(6.7) declaration:
            declaration-specifiers init-declarator-listopt ;
            static_assert-declaration

(6.7) init-declarator-list:
            init-declarator
            init-declarator-list , init-declarator

(6.7) init-declarator:
            declarator
            declarator = initializer

(6.8) statement:
            labeled-statement
            compound-statement
            expression-statement
            selection-statement
            iteration-statement
            jump-statement

(6.8.2) compound-statement:
            { block-item-listopt }

(6.8.4) selection-statement:
            if ( expression ) statement
            if ( expression ) statement else statement
            switch ( expression ) statement

  • Außerdem gibt es einige Unterschiede zwischen C und C++, die am besten gelöst werden, indem Sie direkt zur Dokumentation gehen. Überprüfen Sie meine Antwort bzgl while Schleife, in der ich mit demselben Kompilierungsfehler gerungen habe.

    – Lebensbalance

    10. Mai 2015 um 18:28 Uhr

  • Die Fehler aus dieser Antwort und Ihrer sind nicht genau gleichwertig. Diese Antwort befasst sich mit dem Hauptteil der Ablaufsteuerungsanweisung (der Aussage Teil von if ( expression ) statement), während Ihre sich mit der Kontrolle befasst Ausdruck. Bei dieser Antwort sind die C- und C++-Grammatik identisch.

    – schau

    13. Mai 2015 um 19:07 Uhr


{ } –>

definiert Umfang, also if(a==1) { int b = 10; } sagt, Sie definieren int b für {}- diesen Bereich. Zum

if(a==1)
  int b =10;

es gibt keinen Spielraum. Und Sie werden nicht in der Lage sein, zu verwenden b irgendwo.

  • Danke, jetzt habe ich es.

    – MsPillai

    15. März 2014 um 5:18 Uhr

  • @MsPillai Willkommen. Wenn die Frage also gelöst ist, können Sie die Antwort akzeptieren.

    – Pranit Kothari

    15. März 2014 um 5:33 Uhr

  • Es scheint nicht um den Umfang zu gehen. Bitte überprüfen Sie die Antwort von @sheu .

    – MsPillai

    15. März 2014 um 9:01 Uhr

Bei C89 kann eine Variable nur am Anfang eines Blocks definiert werden.

if (a == 1)
    int b = 10;   // it's just a statement, syntacitially error 

if (a == 1)
{                  // refer to the beginning of a local block 
    int b = 10;    // at the top of the local block, syntacitially correct
}                  // refer to the end of a local block

if (a == 1)
{
    func();
    int b = 10;    // not at the top of the local block, syntacitially error, I guess
}

  • Ein Block definiert einen Lebensbereich der Variablen, in denen.

    – Benutzer3422531

    15. März 2014 um 7:35 Uhr

  • “es ist nur eine Aussage” – eigentlich ist es eine Erklärung. Eine Aussage wäre dort legal. Das if muss eine Anweisung folgen, jedoch zählt eine in geschweifte Klammern eingeschlossene Liste von Deklarationen und Anweisungen als Anweisung.

    – MM

    15. März 2014 um 8:31 Uhr

1397070cookie-checkC-Fehler: Erwarteter Ausdruck vor int

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

Privacy policy