請問std::cout << 中的<<是什麼作用啊?

是向左移動兩位嗎?


以下為手機碼字,所以沒法用代碼塊,請見諒。

首先回答題主問題:不是。

這個運算符有兩個作用,一個是題主說的位運算,另一個是cout這類場合中的流運算符。

流運算符,可以把它理解為數據流向。

cout是數據輸出介面,比如把它當成控制台顯示界面。

然後&<&<流運算符,就是輸出流運算符,作用是把運算符右邊的數據輸出到運算符左邊的目標。

比如cout &<&< 3.14,就是把數字3.14輸出到控制台。運行這段代碼,你會看到控制台(就那個黑框框)里顯示出了3.14。

反過來也一樣,&>&>是流輸入運算符,cin是控制台輸入介面。

float num;

cin &>&> num;

就是從控制台讀取一個浮點數到num,於是可以在黑框框里輸入3.14,回車,這個數就存進num里了。

流運算符可以連續使用,比如cout &<&< 3.14 &<&< 「 」 &<&< 「hello world!」,控制台就會顯示

3.14 hello world!

反過來也是。

float numA;

int numB;

cin &>&> numA &>&> numB;

就會依次讀入一個float和一個int,這兩個在輸入時用空格分隔。

以上四個例子,對應的c代碼是:

printf(「%f」, 3.14);

scanf(「%f」, num);

printf(「%f %s」, 3.14, 「hello world!」);

scanf(「%f %d」, numA, numB);

發現什麼了沒?

用流運算符做輸入輸出,一來數據流向更直觀,二來不用費心寫%類型標記,運算符會自動識別類型。

不過壞處是,做類似%5.2f這種格式化輸出會比較麻煩。

對了,流運算符中,要輸出換行有兩種方式,一種是輸出字元
,一種是輸出特定的換行標識符std::endl。

這裡建議用第二種。因為第二種除了顯示換行,同時還負責刷新輸出緩衝。

什麼意思呢?從/往硬體(如顯示器)輸入/輸出東西是很耗時的,所以平時寫入到cout里的東西,程序會將其暫存起來,不會馬上顯示出去。只有當存滿一定量,或者接收到std::endl時才會將緩存的數據顯示到控制台。

printf也是一樣的,不過是識別
來刷新緩衝。std::cout則不會用
刷新緩衝,必須使用std::endl。

(其實std::cout的輸出和printf是同步的,所以一般情況
是可以刷新緩衝的。但這個同步可以關掉,此時就必須使用endl刷新緩衝了。)

(關閉與printf的同步有什麼用呢?寫oj的可能就明白了,printf和scanf由於要解析格式字元串,理論性能應該是低於cin cout的。但cin cout由於要和printf scanf同步,性能反而更低。這時關掉同步,就可以獲得理論上應有的高性能)

(自己用getchar寫的魔改版快速輸入不算,那個性能比cin還高。其實cin應該更高的,但它讀取數字時除了解析標準寫法,還要兼顧科學計數法等奇葩寫法,效率就被拉下來了)


這個符號的原意是左移一位,只對整型有效。但是作為一個運算符,可以被重載,就被重載成流輸入符了。內部實現大致是調用系統api把字元寫進標準輸出,然後返回自身以便繼續輸出


運算符重載,輸出流


std::cout就是c++的標準輸出和c的stdout是一致的,cout就是console out控制台輸出。然後&<&<作為運算符被重載為流輸出,意思就是把後邊的內容標準輸出到cout裡面,默認為顯示器。&<&<是可以被類成員重載的,你想怎麼實現是你的事情。


可以說是教科書式的瞎重載

C++的標準IO真是又重又難用


個人感覺更像是一個特殊的函數。


不是。

&<&<是一個操作符,就像函數一樣可以接受參數,不同的參數就有不同的行為,就類似於函數的重載。

這裡它的參數是cout和要輸出的值,cout是一個由標準庫定義好了的ostream對象,綁定到標準輸出(一般是屏幕)。

這裡實際上就是調用

operator&<&<(cout , your_value)

可以類比+,比如

定義兩個整型變數a,b,

a+b就是把兩個變數相加,返回得到的值。

這裡&<&<將要輸出的值追加到流(由cout管理)的末尾,並返迴流的引用,就是cout對象的引用。


你看這個&<&< 和&>&>就跟箭頭一樣,很形象。

std::cout &<&< "hello";

中的&<&< ,就是把「hello」輸出到屏幕上。

std::string myString;
std::cin &>&> myString;

中的&>&>, 就是把你鍵盤輸入的東西存進變數myString里。

至於什麼叫標準輸入輸出流,什麼叫重載運算符,&<&< 和&>&>還能做什麼,比如移位,你得自己慢慢學習了。


相當於調用了cout這個對象所在的類的.operator&<&<()函數,

也就是 cout.operator&<&<(運算符右邊那個數)。

為啥能連著用呢?因為它的返回值還是cout.


&<&<不就是c艹重載過得運算符么,你要是討厭這個,自己封裝個 fuckout 重載 = 來做輸出也可以,前提是你得確定不會被別人打死


只是個運算符,不要想太多。

operator&<&<也可以自己重載


推薦閱讀:

網路信號是以光速傳播的,為什麼伺服器的地理位置還那麼重要?
有哪些輕量級web伺服器?
c語言編寫一個linux下的類似於qq聊天軟體的伺服器 ?
長期開機的機器是怎麼會那麼耐用的?
浪潮公司為什麼是從濟南發展起來的?

TAG:編程 | 伺服器 | C | CC |