2012-12-29 199 views
4

嗨,大家好,我是C++新手(和SO),想知道爲什麼當我打印這個函數時總是會輸出爲1。好的這裏的代碼:打印功能時,爲什麼總是輸出爲1?

#include <iostream> 
using namespace std; 

int main() { 
    int x(int()); 
    cout << x; // 1 
} 

它總是打印出一個。爲什麼?我期待它輸出0,因爲整數默認爲0.那麼爲什麼是1?

+3

你知道,'x'不是'int',對不對?你似乎,但它不完全清楚你的問題...... –

+0

@ K-ballo我知道這一點。這是一個功能嗎? –

+0

那你爲什麼期望它打印'0'? int的_value initialization_和那個有什麼關係? –

回答

2
int x(int()); 

是「most vexing parse」的情況;您認爲這是一個intint 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(); 
1

函數正在轉換爲bool並正在打印爲bool值。該函數位於非零地址,因此轉換生成true

這是一個標準轉換序列,由一個函數到指針的轉換,後跟一個布爾轉換組成。

接下來的順序是因爲沒有更好的重載operator<<

+0

爲什麼會發生? 'int()'返回0(剛剛測試過),無論如何將會被拋棄到'false'。 – slugonamission

+3

@slugonamission:'int x(int());'聲明'x'作爲一個函數(返回'int'並且帶一個'int(*)()'參數)。在這種情況下,'x'不是int,並且'int()'不是臨時的int。 – Mankarse

+0

我需要重新閱讀語言規範。乾杯:) – slugonamission