Computer une fonction sans appeler : percer le mystère
Imaginez ceci : vous codez et au lieu d'invoquer une fonction avec des parenthèses, vous imprimez simplement son nom. Étonnamment, le résultat est toujours 1. Cette approche non conventionnelle vous laisse perplexe, tant sur les 1 que sur l'absence du pointeur de fonction attendu.
Plongeons dans les subtilités de votre code :
<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 }
Contrairement à votre intention, vous n'appelez pas réellement la fonction pr dans le fichier cout<< déclarations. Au lieu de cela, vous transmettez son pointeur de fonction à cout. Cela provoque la conversion implicite de pr en une valeur booléenne, ce qui entraîne les 1 omniprésents dans votre sortie.
Pour améliorer votre compréhension, envisagez d'utiliser cout << boolalpha avant l'impression. Cela affichera vrai au lieu de 1, renforçant la nature booléenne de la sortie.
Alors que C 11 offre une solution élégante :
<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>
Cette surcharge vous permet d'imprimer des pointeurs de fonction d'arité arbitraire , affichant des informations telles que l'adresse du pointeur de fonction et le nombre de ses arguments.
Donc, voilà : les 1 énigmatiques ne sont pas une simple coïncidence mais le résultat d'une conversion de type implicite. Comprendre ce comportement est crucial pour éviter des résultats inattendus et créer un code plus robuste.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!