2015-02-22 17 views
5
#include <iostream> 

int main(){ 
    std::cout << main << std::endl; 
    return 0; 
} 

Warum druckt 1 in der Befehlszeile?Warum std :: cout << haupt << std :: endl druckt 1?

+2

Aus Neugier, was Sie * erwartet * diesen Code zu drucken? main ist in diesem Fall ein Funktionszeiger. –

+0

@ JonathonReinhart: Ist es das? Denken Sie daran, 'main' ist speziell ... – Deduplicator

+1

Es ist wahrscheinlich undefiniertes Verhalten. Du sollst nicht Haupt nennen. Siehe http://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c/2128727#2128727. – juanchopanza

Antwort

5

Ihr Programm ist schlecht formatiert. N4140:

§3.6.1/3 Die Funktion main darf nicht innerhalb eines Programms verwendet werden. [...]

Wenn wir behaupten, dass das Programm nicht schlecht gebildet war, die wahrscheinlichste Erklärung ist die Standard-Conversions:

§4.3/1 ein L-Wert von Funktionstyp T können in einen Prvalue von Typ "Zeiger auf T umgewandelt werden." Das Ergebnis ist ein Zeiger auf die Funktion.

§4.12/1 Ein Wert von arithmetischer, nicht beschnittener Aufzählung, Zeiger oder Zeiger auf Elementtyp kann in einen Pr-Wert vom Typ bool konvertiert werden. Ein Nullwert, Nullzeigerwert oder Nullelementzeigerwert ist konvertiert in false; Jeder andere Wert wird in true konvertiert. Bei Direkt-Initialisierung (8.5) kann ein Pr-Wert vom Typ std::nullptr_t in einen Pr-Wert vom Typ bool konvertiert werden; Der resultierende Wert ist false.

Wenn Sie tun dies darauf bestehen, versuchen:

std::cout << (void*)main << std::endl; 
+0

Vergessen Sie nicht den Teil, wo 'Std: : ostream hat keinen '<<' Operator, der einen Funktionszeiger mit der Signatur 'int (*) (void)' akzeptiert, weshalb der Zeiger überhaupt in einen anderen Typ konvertiert wird. –

+0

in [dieser Frage] (http://Stackoverflow.com/a/2741896/995714) Ich sah 'main' wurde oft verwendet –

+0

@ LưuVĩnhPhúc Das ist C. Ich habe bisher keine Standard-Zitate gesehen, die sagen, dass es krank ist -geformt in C. –

Verwandte Themen