Im folgenden Code:
%Vor%in der Zeile
%Vor% Ich habe bemerkt, dass der unäre &
(Adresse von) -Operator optional ist, und das Programm kompiliert und läuft genauso mit oder ohne es (in Linux mit GCC 4.2.4). Warum? Ist dies ein Compiler-spezifisches Problem oder werden vielleicht zwei verschiedene Sprachstandards vom Compiler akzeptiert? Danke.
Operator &
ist in der Tat optional, wenn die Adresse einer Funktion in Ihrem Kontext verwendet wird (Zuweisung an etwas). Es ist nicht compilerspezifisch, es folgt aus der formalen Definition der Sprache.
Symmetrisch ist der Operator *
optional, wenn die Funktion über einen Zeiger aufgerufen wird. In Ihrem Beispiel könnten Sie die Funktion entweder als (*logfunc)(n)
oder logfunc(n)
aufrufen. Du hast letzteres benutzt, aber das erste würde auch funktionieren.
Sie haben Recht, dass &
optional ist. Funktionen wie Arrays können automatisch in Zeiger umgewandelt werden. Es ist weder Compiler-spezifisch noch das Ergebnis verschiedener Sprachstandards. Von der Norm Abschnitt 6.3.2.1 , Absatz 4:
Ein Funktionsbezeichner ist ein Ausdruck mit einem Funktionstyp. Außer wenn es der Operand des
sizeof
-Operators oder des unären&
-Operators ist, ein Funktionsbezeichner mit dem Typ "function returning type msgstr "" "wird in einen Ausdruck konvertiert, der den Typ" Zeiger auf Funktion hat und Typ zurückgibt ".
Antworten in C ++. Für C gilt das Gleiche:
Zitat aus dem C ++ - Standard (4.3.1):
Ein Lvalue des Funktionstyps T kann sein konvertiert in einen rvalue des Typs "Zeiger auf T." Das Ergebnis ist a Zeiger auf die Funktion.50)
Dasselbe gilt für Arrays. (4.2.1)
Ein L-Wert oder R-Wert vom Typ "Array ofN T "oder" Array mit unbekannter Bindung von T " kann in einen rvalue des Typs umgewandelt werden "Zeiger auf T." Das Ergebnis ist a Zeiger auf das erste Element des Array.
Aber bitte beachten Sie, dass dies Konvertierungen sind und keinesfalls eine Funktion ein Funktionszeiger oder ein Array ein Zeiger ist. HTH
Aus dem Standard (6.3.2.1/4):
Ein Funktionsbezeichner ist ein Ausdruck das hat Funktionstyp. Außer wenn es ist der Operand der Größe von Betreiber oder der unäre & amp; Betreiber, a Funktionsbezeichner mit Typ '' Function returning type '' ist zu einem Ausdruck konvertiert, der Geben Sie '' Zeiger auf Funktion zurück Geben Sie '' ein.
Also, das Weglassen von &
ergibt trotzdem einen Zeiger, um zu funktionieren.
Tags und Links c gcc function-pointers