2014-04-11 154 views
0

爲什麼當你寫兩次std :: cout時,它顯示了十六進制值,然後你想輸出什麼?Cout和十六進制[C++]

E.g.

std::cout << std::cout << "Hello!"; 
+0

也許你正在得到'cout'的指針值,然後是「你好!」 – IllusiveBrian

回答

0

std::ostream有一個轉換運算符,允許轉換爲void*,以便您可以測試操作是否成功。在表達

std::cout << std::cout // similar to 
         // std::cout.operator<<(std::cout.operator void*()) 

右手操作數表達std::cout使用該轉換運算符,然後將operator<<does the output of this via the ostream operand隱式轉換爲void const*。看到這另一種方法是:

const void* cp = std::cout.operator void*(); 
std::cout << cp << "Hello!" << std::endl; 
std::cout << std::cout << "Hello!"; 

輸出:

0x601088Hello!

0x601088你好!

2

std::cout具有類型std::ostream(或東西從 它衍生的)。沒有<<這個類型在右邊,所以 編譯器尋找一個轉換。在pre-C++ 11中, std::ostream隱式轉換爲void*(用於 條件),因此編譯器使用此;你看到的是 轉換運算符返回的輸出(典型地, 對象本身的std::ostream地址,但所有 所需的是它是一個非空指針)。