2012-05-18 63 views
4

在下面的代碼我糊塗了,並增加了+,它應該是< <+運算符在cout中做什麼?

#include <iostream> 
#include "Ship.h" 

using namespace std; 

int main() 
{ 
    cout << "Hello world!" << endl; 
    char someLetter = aLetter(true); 
    cout <<"Still good"<<endl; 
    cout << "someLetter: " + someLetter << endl; 
    return 0; 
} 

應該

cout << "someLetter: " << someLetter << endl; 

不正確的代碼輸出:

世界,你好!
還是不錯的
OS ::明確

我不明白的是爲什麼編譯器沒抓到任何錯誤,是什麼操作系統::清楚是什麼意思?此外,爲什麼不在線的開頭「someLetter:」?

回答

8

這裏,"someLetter: "是一個字符串文字,即const char *指針,通常指向存儲所有字符串文本的只讀區域。

someLetterchar,因此"someLetter: " + someLetter執行指針運算並將someLetter的值添加到存儲在指針中的地址。最終的結果是一個指針,指向您打算打印的字符串文字的某處。

在你的情況,似乎指針結束在符號表中,並指向ios::clear方法的名稱的第二個字符。儘管這是完全任意的,但指針可能最終指向另一個(可能不可訪問的)位置,具體取決於someLetter的值和字符串字面值存儲區的內容。總之,這種行爲是不確定的,你不能依賴它。

2

我認爲C字符串"someLetter: "正在使用char someLetter作爲索引,因此指向內存的一部分。因此,行爲。

在C++中,如果你做了愚蠢的事情,你會得到奇怪的行爲。這種語言給你足夠的繩索來與自己掛在一起。

0

您必須記住,文字字符串只是指向某些內存區域的指針。 "someLetter: " + someLetter的作用是向該指針添加一個值,然後嘗試打印該指針。

+0

我不記得文字字符串只是指針,因爲我從來沒有聽說過:-)這是如何工作的? – Celeritas

+2

字符串文字是**不是**指針。他們是常量字符數組。因此,它們的行爲與任何數組相同,有時可能會衰減到指向其第一個元素的指針。 –

2

+正在做指針算術"someLetter: "

3

+運營商與cout無關。

this表中可見,+具有比<<更高的優先級,所以問題的代碼線被解析如下:

(cout << ("someLetter: " + someLetter)) << endl; 

換句話說,+被施加到一個字符指針和炭。 char是一個完整的數據類型,所以你真的在執行指針算術,把右邊的char的整數值加到左邊的指針上,產生一個新的char指針。