嗨,大家好,我是C++新手(和SO),想知道爲什麼當我打印這個函數時總是會輸出爲1。好的這裏的代碼:打印功能時,爲什麼總是輸出爲1?
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它總是打印出一個。爲什麼?我期待它輸出0,因爲整數默認爲0.那麼爲什麼是1?
嗨,大家好,我是C++新手(和SO),想知道爲什麼當我打印這個函數時總是會輸出爲1。好的這裏的代碼:打印功能時,爲什麼總是輸出爲1?
#include <iostream>
using namespace std;
int main() {
int x(int());
cout << x; // 1
}
它總是打印出一個。爲什麼?我期待它輸出0,因爲整數默認爲0.那麼爲什麼是1?
int x(int());
是「most vexing parse」的情況;您認爲這是一個int
(int x
)的聲明,初始化爲整數(int()
)的默認值;相反,編譯器把它解釋爲一個函數返回一個int
這需要作爲一個參數(指針)函數不帶任何參數,並返回一個聲明的int
(你可能會很麻煩聲明由this site解釋,或獲得的一些更多的瞭解C型聲明here)。
然後,當你這樣做:
cout << x;
x
這裏衰減到函數指針,但沒有的operator<<
重載需要一個函數指針;給出的operator<<
一些有效的過載是bool
,並且,由於一個函數指針不能有0(NULL
)值的最簡單的隱式轉換,它被評價爲true
,其被印刷爲1
注意,I」 m不能完全確定這樣的代碼應該沒有錯誤地被編譯 - 你正在接受一個函數的地址,這個函數只是被聲明而沒有被定義;它是真的,它不能進行評估,以比true
其他任何東西,但原則上的線,你應該得到一個鏈接錯誤(由優化這裏掩蓋,這消除了x
任何引用,因爲它沒有實際使用)。
你其實想的是:
int x=int();
函數正在轉換爲bool
並正在打印爲bool
值。該函數位於非零地址,因此轉換生成true
。
這是一個標準轉換序列,由一個函數到指針的轉換,後跟一個布爾轉換組成。
接下來的順序是因爲沒有更好的重載operator<<
。
爲什麼會發生? 'int()'返回0(剛剛測試過),無論如何將會被拋棄到'false'。 – slugonamission
@slugonamission:'int x(int());'聲明'x'作爲一個函數(返回'int'並且帶一個'int(*)()'參數)。在這種情況下,'x'不是int,並且'int()'不是臨時的int。 – Mankarse
我需要重新閱讀語言規範。乾杯:) – slugonamission
你知道,'x'不是'int',對不對?你似乎,但它不完全清楚你的問題...... –
@ K-ballo我知道這一點。這是一個功能嗎? –
那你爲什麼期望它打印'0'? int的_value initialization_和那個有什麼關係? –