請問std::cout << 中的<<是什麼作用啊?
01-21
是向左移動兩位嗎?
以下為手機碼字,所以沒法用代碼塊,請見諒。
首先回答題主問題:不是。
這個運算符有兩個作用,一個是題主說的位運算,另一個是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聊天軟體的伺服器 ?
※長期開機的機器是怎麼會那麼耐用的?
※浪潮公司為什麼是從濟南發展起來的?