Eine Funktion ohne Aufruf erläutern: Das Geheimnis lüften
Stellen Sie sich Folgendes vor: Sie programmieren weg und statt eine Funktion mit Klammern aufzurufen, Sie drucken einfach den Namen aus. Überraschenderweise ist das Ergebnis immer 1. Dieser unkonventionelle Ansatz lässt Sie ratlos zurück, sowohl über die Einsen als auch über das Fehlen des erwarteten Funktionszeigers.
Lassen Sie uns in die Feinheiten Ihres Codes eintauchen:
<code class="c++">#include <iostream> using namespace std; void pr() { cout << "sth"; } int main() { pr; cout << pr; // output: 1 cout << *pr; // output: 1 cout << ≺ // output: 1 }
Entgegen Ihrer Absicht rufen Sie die Funktion pr im cout<< nicht tatsächlich auf. Aussagen. Stattdessen übergeben Sie den Funktionszeiger an cout. Dies führt dazu, dass pr implizit in einen booleschen Wert konvertiert wird, was zu den allgegenwärtigen Einsen in Ihrer Ausgabe führt.
Um Ihr Verständnis zu verbessern, sollten Sie die Verwendung von cout << in Betracht ziehen. boolalpha vor dem Drucken. Dadurch wird wahr statt 1 angezeigt, was die boolesche Natur der Ausgabe verstärkt.
Während C 11 eine elegante Lösung bietet:
<code class="c++">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>
Mit dieser Überladung können Sie Funktionszeiger beliebiger Stelligkeit drucken und zeigt Informationen wie die Adresse des Funktionszeigers und die Anzahl seiner Argumente an.
Da haben Sie es also: Die rätselhaften Einsen sind kein bloßer Zufall, sondern das Ergebnis einer impliziten Typkonvertierung. Das Verständnis dieses Verhaltens ist entscheidend, um unerwartete Ergebnisse zu vermeiden und robusteren Code zu erstellen.
Das obige ist der detaillierte Inhalt vonWarum führt das Drucken eines Funktionsnamens in C zu „1'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!