Wieso sizeof int ist falsch, während sizeof(int) ist die richtige?

Wissen wir, dass sizeof ist ein operator, der verwendet wird für die Berechnung der Größe eines beliebigen Datentyp und Ausdruck, und wenn der operand ist ein Ausdruck, der von Klammern können weggelassen werden.

int main()
{
        int a;

        sizeof int;
        sizeof( int );
        sizeof a;
        sizeof( a );

        return 0;
}

ersten Nutzung sizeof ist falsch, andere richtig.

Wenn es kompiliert wird mit gcc folgende Fehlermeldung gegeben:

main.c:5:9: error: expected expression before int

Meine Frage ist, warum der C-standard nicht ermöglichen, diese Art von operation. Wird sizeof int Ursache von Mehrdeutigkeiten?

  • Das lustige an der Sache ist, dass nicht alle Ausdrücke werden akzeptiert, ohne Klammern: versuchen sizeof (int)a.
  • OP ist zu Fragen, die Argumentation hinter dem standardese Zitate kennt er bereits die Zitate, die erwähnt werden markiert beantworten.
  • Ich denke, das ist, weil eine Klammer nach dem "sizeof" wird interpretiert als Teil der sizeof-operator, anstatt GEHÖRIG etwas auf den rest des Ausdrucks (die hätte den Typ-cast-operator). Wenn also verstehe ich das richtig, Sie hätte etwas geschrieben zu verdecken wie sizeof *&(int)a und dann wäre es okay gewesen, da wir am Ende mit einem Ausdruck, und nicht eine Art.
  • sizeof +(int)a hat den Vorteil, über *& tatsächlich kompilieren 😉
  • Ah stimmt, es ist kein lvalue. Wenn er kompilieren in Embarcadero C++, seltsam genug. Trotzdem glaube ich, dass wir gerade jetzt eine Verwendung für den unären + - operator! Das muss das erste mal in der Geschichte der C-Programmierung 🙂
  • Sie haben noch vorsichtig sein mit dem unären +. Zum Beispiel sizeof +(char)a == sizeof(int) aufgrund von integer-promotion, ist es wahrscheinlich weniger Fehler-anfällig nur zu setzen in die Klammern, wenn es irgendeine Sorge über den Ausdruck, den Sie versuchen zu nehmen, die Größe. Also ich bin mir nicht sicher, ich würde so weit gehen, nennen es "Verwendung", obwohl ich zugeben, ich habe es zu benutzen...
  • In der Tat. All das ist hervorragendes material für die IOCCC, aber vielleicht nicht für real life-code 🙂
  • lassen Sie uns weiter, diese Diskussion im chat

InformationsquelleAutor Yishu Fang | 2012-10-29
Schreibe einen Kommentar