2014-06-15 130 views
-5

新的C++,知道使用< <在e.g:算術與<<操作

cout<<"hi"; 

,但以下幾點:

int a = 1<<3; 
cout<<a; 

將輸出8;爲什麼我只是問這個問題?我如何解釋在這裏使用< <?

+3

在提問之前做一些研究。 –

回答

2

<<運算符在應用於整數時執行位移。

1二進制是由三個比特00000001移位它,你會得到00001000,這是8

+0

短而簡單,thx很多! – user3660678

1

1<<3<<是逐位左移位運算符不是流插入。它會將1左移三位。

0

每個特定操作符所執行的操作以及該操作的結果取決於其左側和右側的類型/對象的類型,因此對於不同的對象需要不同的結果。如前所述,在這種情況下,它會執行一個位移,因爲這是爲這個運算符定義的操作,當左側和右側元素都是int時。在

cout<<"hi"; 

情況下,必須在左邊一個std :: ostream的類型,和右邊的的std :: string類型,這就是爲什麼這種操作的結果是不同的 - 「< <」的在這種情況下定義爲插入運算符;在兩個整數的情況下,它被定義爲移位運算符

0
int a = 1<<3; 

這是「真實的」<<運營商。它執行位移。在高級代碼中通常不需要這樣的操作;它可以追溯到過去,早在C++存在之前,那時只有C,程序員不得不比現在的世界更頻繁地修改這些東西。

爲了理解發生了什麼,您需要知道二進制數是如何工作的。

一個小數1具遺骸,巧合的是,在二元一樣:

1 

現在想象在它前面的一些零(這通常使得它更容易理解,適合初學者 - 領先的零不改變號碼的意思,無論是在十進制也不二進制):

...00000001 

<<操作的比特向左移動:

moved by 3 positions 
     +--+ 
     | | 
     v | 
...00001000 

現在刪除前導零:

1000 

在這裏,我們走了。二進制1000爲十進制8(1 * 8 + 0 * 4 + 0 * 2 + 0 * 1)。有關詳細信息和有趣的角落案例,請查閱任何優秀的C++書籍或在線教程。

現在讓我們來看看<<其他含義,C++:

cout<<"hi"; 

這是一個重載運營商。 C++允許你使用幾乎所有的內置運算符,併爲不同的類提供新的含義。該語言的標準庫完全符合std::ostream(其中std::cout是一個實例)。這個意思與位移沒有任何關係。它大致意思是「輸出」。

現在,採用一個操作符並給它賦予一個與其原始完全無關的含義被認爲是糟糕的編程風格。可接受使用操作符重載的例子是當新的含義對原始語義有意義時,例如當你爲數學矩陣類重載+-。但是,當C++被髮明時,這個特性顯然被更加寬鬆地使用。

這就是爲什麼我們今天堅持與<<(和>>)完全不同的意思。事實上,對於很多初學者來說,新的語義甚至似乎掩蓋了原來的語義(如你的問題所證明的)。