Heim  >  Artikel  >  Backend-Entwicklung  >  Warum liefert das Drucken eines Funktionszeigers ohne Aufruf „1“ in C?

Warum liefert das Drucken eines Funktionszeigers ohne Aufruf „1“ in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-25 07:37:29139Durchsuche

Why Does Printing a Function Pointer Without Invocation Yield

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 << &pr; // 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn