Drucken eines Funktionszeigers ohne Aufruf: Die mysteriöse Ausgabe von 1 verstehen
In einem faszinierenden Codeausschnitt wird eine Funktion ohne „aufgerufen“. indem man seine Klammern aufruft („pr;“) und dann mit std::cout ausgibt. Überraschenderweise ergibt das Ergebnis durchweg 1 und übertrifft damit die Erwartungen.
Das Rätsel der konstanten Einsen
Der Code ruft die Funktion auf drei verschiedene Arten auf:
<code class="cpp">cout << pr; // output: 1 cout << *pr; // output: 1 cout << ≺ // output: 1
Die Intuition legt nahe, dass anstelle der rätselhaften Einsen ein Funktionszeiger gedruckt werden sollte. Um dieses Verhalten zu verstehen, muss man sich jedoch eingehender mit den Typkonvertierungsmechanismen von C befassen.
Typkonvertierung und Bool-Werte
Bei der Übergabe als Argument an cout ist pr implizit in einen Bool umgewandelt. Diese Konvertierung erfolgt, weil „bool“ ein grundlegender Typ ist und „cout“ einen grundlegenden Typ als Eingabe erfordert. In C ist ein konvertierter Bool-Wert wahr, wenn der ursprüngliche Wert ungleich Null ist, und falsch, wenn er Null ist.
Da pr ein Funktionszeiger ist, ist sein Wert eine Speicheradresse ungleich Null. Wenn es in bool konvertiert wird, wird es daher als wahr ausgewertet, was von cout als 1 ausgegeben wird.
Anpassen des Funktionszeigerdrucks (ab C 11)
C 11 führt ein eine anpassbare Überladung, die ein informativeres Drucken von Funktionszeigern ermöglicht:
<code class="cpp">template <class RType, class ... ArgTypes> std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...)) { return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")"; }</code>
Diese Überladung gibt die Adresse des Funktionszeigers und die Anzahl der Argumente aus, die er benötigt. Es kann verwendet werden, um pr wie folgt zu drucken:
<code class="cpp">cout << pr; // output: (func_ptr=0x12345678)(num_args=0)</code>
Dieser Ansatz bietet eine aussagekräftigere Ausgabe und erleichtert das Verständnis der Eigenschaften des Funktionszeigers.
Das obige ist der detaillierte Inhalt vonWarum liefert das Drucken eines Funktionszeigers ohne Aufruf „1' in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!