& operator optional in der Funktionszeigerzuweisung

8

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.

    
pr1268 28.11.2010, 19:42
quelle

4 Antworten

13

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.

    
AnT 28.11.2010, 19:56
quelle
14

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 ".

    
Carl Norum 28.11.2010 19:45
quelle
7

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

    
Armen Tsirunyan 28.11.2010 19:49
quelle
5

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.

    
icecrime 28.11.2010 19:52
quelle

Tags und Links