Warum (und Wann) brauche ich Klammern nach sizeof?
Die unten nicht kompiliert werden:
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
aber wenn ich es ändern zu
sizeof(arr);
alles in Ordnung ist. Warum?
- sizeof als Betreiber ist nicht verfügbar in ansi-c
- mein Exemplar von K&R (die früheste Beschreibung der C-Sprache, die ich habe) ist sehr weit Weg und ich kann nicht überprüfen Sie es jetzt, aber ich bin mir 110% sicher, das es beschreibt
sizeof
grundsätzlich der gleichen Weise C99-Standard heute.sizeof
verfügbar ist, da vor C standardisiert wurde von ANSI im Jahr 1989. - Sorry, mein Fehler..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut 6.5.3 gibt es zwei Formen für
sizeof
wie die folgenden:Seit
arr
im code ist eintype-name
wird, muss es in Klammern.sizeof
ist ein Betreiber: die Klammer "gehören" die Art, nicht der Betreiber.sizeof
als Betreiber.sizeof ( type-name )
. Aber für die erste form, die Sie kann schreiben, zum Beispielsizeof(x)
, und obwohl es sieht aus wie ein Funktionsaufruf (wennsizeof
waren nicht ein Stichwort), es ist wirklich ein operator angewendet auf einen eingeklammerten Ausdruck. Ist es das, was du im Sinn hatte?sizeof
ist, syntaktischsizeof <SOMETHING>
im Gegensatz zu Funktionen, zum Beispiel, um eineprintf
dieprintf ( <SOMETHING> )
. Die Klammern gehören zu denprintf
aber nicht zusizeof
. Wennsizeof
angewendet wird, um eine in Klammern eingeschlossene Typ-name, ich mag zu denken, dass als eine Form von nichts - "die Rückkehr" nur der Typ.sizeof ( type-name )
als seine eigene Art des Ausdrucks. (Der standard nennt es ein operator, aber( type-name )
ist nicht wirklich ein operand im üblichen Sinn.)sizeof(0)["abcdefghij"]
ist1
.sizeof(0)["abcdefghij"]
istsizeof("abcdefghij"[0])
. Siehe stackoverflow.com/q/381542Dass die Art, wie die Sprache angegeben wird, geben Sie die Namen müssen in Klammern hier.
Angenommen, die Grammatik wie folgt aussah:
sizeof unary-expression
sizeof type-name
Nun, z.B. den folgenden Ausdruck wäre mehrdeutig:
Könnte es entweder
sizeof(int *) + 0
odersizeof(int) * +0
. Diese Mehrdeutigkeit entsteht nicht für unäre Ausdrücke, als ein Sternchen angehängt, ein Ausdruck ist nicht ein Ausdruck (aber für einige Typ-Namen Anhängen, ist wieder ein Typ name).Etwas musste hier angegeben werden, und die Typ-Namen werden in Klammern ist ein Weg zur Lösung der Mehrdeutigkeit.
Ich denke, es ist weil Sie haben
typedef
. Wenn Sie es zu entfernen, sollte es kompilieren.Beispiel aus der wikipedia: