Wir wissen, dass dies sizeof
ein Operator ist, der zum Berechnen der Größe eines Datentyps und Ausdrucks verwendet wird. Wenn der Operand ein Ausdruck ist, können die Klammern weggelassen werden.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
Die erste Verwendung von sizeof
ist falsch, während andere richtig sind.
Wenn es mit gcc kompiliert wird, wird die folgende Fehlermeldung ausgegeben:
main.c:5:9: error: expected expression before ‘int’
Meine Frage ist, warum der C-Standard diese Art von Betrieb nicht zulässt. Wird sizeof int
es zu Mehrdeutigkeiten kommen?
sizeof (int)a
.sizeof +(int)a
hat den Vorteil gegenüber dem*&
tatsächlichen Kompilieren ;-)+
. Zum Beispiel ist essizeof +(char)a == sizeof(int)
aufgrund der Ganzzahl-Heraufstufung wahrscheinlich weniger fehleranfällig, nur in Klammern zu setzen, wenn Sie sich überhaupt Gedanken über den Ausdruck machen, dessen Größe Sie verwenden möchten. Ich bin mir also nicht sicher, ob ich es "eine Verwendung" nennen würde, obwohl ichAntworten:
Folgendes könnte mehrdeutig sein:
Ist das
(sizeof (int*)) + 1
oder(sizeof(int)) * (+1)
?Natürlich hätte die C-Sprache eine Regel einführen können, um die Mehrdeutigkeit aufzulösen, aber ich kann mir vorstellen, warum es nicht störte. Bei der aktuellen Sprache erscheint ein Typspezifizierer in einem Ausdruck niemals "nackt", sodass keine Regeln erforderlich sind, um zu entscheiden, ob diese Sekunde
*
Teil des Typs oder eines arithmetischen Operators ist.Die vorhandene Grammatik löst bereits die potenzielle Mehrdeutigkeit von
sizeof (int *) + 1
. Es ist(sizeof(int*))+1
, nichtsizeof((int*)(+1))
.C ++ hat ein ähnliches Problem, das mit der Cast-Syntax im Funktionsstil behoben werden muss. Sie können schreiben
int(0)
und Sie können schreibentypedef int *intptr; intptr(0);
, aber Sie können nicht schreibenint*(0)
. In diesem Fall besteht die Auflösung darin, dass der "nackte" Typ ein einfacher Typname sein muss. Es kann sich nicht nur um eine alte Typ-ID handeln, die Leerzeichen oder nachfolgende Interpunktion enthält. Vielleichtsizeof
hätte man mit der gleichen Einschränkung definieren können, ich bin mir nicht sicher.quelle
new int*(X)
was mehrdeutig wäre, wenn C ++ nicht angeben würde, dass der neue Operator die längste Zeichenfolge verwendet, die möglicherweise ein Typ sein könnte. In C ++ hätten sie das gleiche mit sizeof machen können, denke ich. Aber in C ++ kann man sagen,sizeof int()
was dann mehrdeutig gewesen wäre (Typ oder Wert initialisiert int?).sizeof int()
schlecht geformt ("neinoperator()
fürsize_t
"), was ich erwarte, wäre unerwünscht!Ab C99 Standard
In Ihrem Fall
int
ist weder Ausdruck noch Name in Klammern.quelle
Es gibt zwei Möglichkeiten, den Operator sizeof in C zu verwenden. Die Syntax lautet wie folgt:
Wenn Sie einen Typ als Operanden verwenden, müssen Sie die Klammer gemäß der Syntaxdefinition der Sprache haben. Wenn Sie sizeof für einen Ausdruck verwenden, benötigen Sie die Klammer nicht.
Der C-Standard gibt ein Beispiel dafür, wo Sie ihn möglicherweise für einen Ausdruck verwenden möchten:
Aus Gründen der Konsistenz und um Fehler im Zusammenhang mit der Priorität des Bedieners zu vermeiden, würde ich persönlich empfehlen, immer () zu verwenden, unabhängig von der Situation.
quelle
sizeof expression
und nicht bewusst zu seinsizeof(type)
, der in dieser Antwort erläutert wird.