国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++輸入和輸出的真實面目

Android編程精選 ? 來源:編程學習總站 ? 作者:代碼的牛頓 ? 2021-09-29 15:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

C++輸入和輸出

在C++里std::cin、std::cout、std::cerr和std::endl分別是標準輸入、標準輸出、標準錯誤輸出和刷新緩沖區并換行,它們都在命名空間std中,那么它們真實面目是什么?我們先來看一段代碼:

#include 《iostream》 int main() { std::cout 《《 “Hello World!” 《《 std::endl; std::cerr 《《 “error” 《《 std::endl; return 0; }

這段代碼很簡單,就是輸出“Hello world!”和“error”,那么這段代碼的底層原理是?我們先來看一下std::cout在標準庫中的定義:

#ifndef _LIBCPP_HAS_NO_STDOUT extern _LIBCPP_FUNC_VIS ostream cout; extern _LIBCPP_FUNC_VIS wostream wcout; #endif 。。.。。. typedef basic_streambuf《char》 streambuf; typedef basic_istream《char》 istream; typedef basic_ostream《char》 ostream; typedef basic_iostream《char》 iostream;

。。.。。. template 《class _CharT, class _Traits》 class _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios《_CharT, _Traits》 { 。。.。。. };

從以上代碼我們可以看出std::cout是一個類basic_stream《char》的一個實例,那么很容易我們就能想到《《很有可能是類basic_stream《char》的一個成員函數,繼續追蹤下去,看看《《到底是啥。在類模板basic_stream中我們找到成員函數聲明如下:

basic_ostream& operator《《(bool __n); basic_ostream& operator《《(short __n);

basic_ostream& operator《《(unsigned short __n); basic_ostream& operator《《(int __n);

basic_ostream& operator《《(unsigned int __n); basic_ostream& operator《《(long __n);

basic_ostream& operator《《(unsigned long __n); basic_ostream& operator《《(long long __n);

basic_ostream& operator《《(unsigned long long __n); basic_ostream& operator《《(float __f);

basic_ostream& operator《《(double __f); basic_ostream& operator《《(long double __f); basic_ostream& operator《《(const void* __p); basic_ostream& operator《《(basic_streambuf《char_type, traits_type》* __sb);

充分證實了我們猜想,《《其實是成員函數operator《《并且返回值是basic_ostream&,到這里我們就可以看出std::cout 《《 “Hello World!”其實是basic_ostream實例變量cout調用成員函數operator《《輸出字符串“Hello World!”并返回basic_ostream&。

那么std::endl是不是某個類的實例呢?我們看看std::endl在標準庫的定義:

template 《class _CharT, class _Traits》 inline _LIBCPP_INLINE_VISIBILITY basic_ostream《_CharT, _Traits》& endl(basic_ostream《_CharT, _Traits》& __os) { __os.put(__os.widen(‘ ’)); __os.flush(); return __os; }

從代碼里可以看出,std::endl其實是一個函數模板,調用該函數會將一個換行符“ ”放入緩沖區,并刷新緩沖區,最后返回basic_ostream&。到這里我們終于明白std::cout 《《 “Hello World!” 《《 std::endl;的含義了,basic_ostream實例變量cout調用成員函數operator《《輸出字符串“Hello World!”,返回basic_ostream&并繼續調用成員函數operator《《輸出換行符并刷新輸出緩沖區。

現在我們很容易想到std::cerr和std::cout應該差不多,區別則是std::cerr是標準錯誤輸出,將信息輸出到標準錯誤流。std::cerr定義如下:

extern _LIBCPP_FUNC_VIS ostream cerr; extern _LIBCPP_FUNC_VIS wostream wcerr; extern _LIBCPP_FUNC_VIS ostream clog; extern _LIBCPP_FUNC_VIS wostream wclog;

最后我們看看std::cin到底是什么玩意,先來看下下面這段代碼:

#include 《iostream》 int main() { std::string name; std::cin 》》 name; return 0; }

代碼很簡單,就是想通過標準輸入輸入名字,并保存在變量name中。有了上面的經驗,我們很容易想到std::cin應該是某個類的實例變量,而》》則是類的成員函數。std::cin的定義如下:

#ifndef _LIBCPP_HAS_NO_STDIN extern _LIBCPP_FUNC_VIS istream cin; extern _LIBCPP_FUNC_VIS wistream wcin; #endif 。。.。。. typedef basic_streambuf《char》

streambuf; typedef basic_istream《char》 istream; typedef basic_ostream《char》 ostream; typedef basic_iostream《char》 iostream;

。。.。。. template 《class _CharT, class _Traits》 class _LIBCPP_TEMPLATE_VIS basic_istream : virtual public basic_ios《_CharT, _Traits》 { 。。.。。. };

從代碼中可以看出std::cin是類basic_istream《char》的實例變量,且basic_istream是類模板。下面我們看看》》在basic_istream中聲明:

basic_istream& operator》》(basic_streambuf《char_type, traits_type》* __sb);

basic_istream& operator》》(bool& __n); basic_istream& operator》》(short& __n);

basic_istream& operator》》(unsigned short& __n); basic_istream& operator》》(int& __n);

basic_istream& operator》》(unsigned int& __n); basic_istream& operator》》(long& __n);

basic_istream& operator》》(unsigned long& __n); basic_istream& operator》》(long long& __n);

basic_istream& operator》》(unsigned long long& __n); basic_istream& operator》》(float& __f);

basic_istream& operator》》(double& __f); basic_istream& operator》》(long double& __f);

basic_istream& operator》》(void*& __p);

不出我們所料》》確實是成員函數operator》》并返回basic_istream&,那么這段代碼std::cin》》name就很容易理解了,basic_istream《char》類實例變量cin調用成員函數operator》》從標準輸入輸入數據,并保存在變量name中。到這里std::cout、std::cin、std::cerr和std::endl的含義終于真相大白了!

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4416

    瀏覽量

    67378
  • C++
    C++
    +關注

    關注

    22

    文章

    2123

    瀏覽量

    77022

原文標題:std::cin、std::cout、std::cerr和std::endl在C++里的真實面目

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil實現cc++混合編程

    起因項目中使用到一個開源的模擬IIC的庫,封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項目中,主要有以下三步操作: 在工程選項中 C/C++中去掉勾選 C99 Mode
    發表于 01-26 08:58

    C語言與C++的區別及聯系

    C語言和C++到底是什么關系? 首先C++C語言本來就是兩種不同的編程語言,但C++確實是對C
    發表于 12-24 07:23

    CC++之間的聯系

    1、語法兼容性: C++完全兼容C語言的語法,這意味著任何有效的C語言程序都可以直接在C++編譯器下編譯通過。 2、底層控制: C++
    發表于 12-11 06:51

    C語言和C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)、封裝、繼承
    發表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時根據條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯使用預處理指令 #ifdef、#endif、#else 和 #elif 來實現。常用的條件編譯指令有
    發表于 12-05 06:21

    C++程序異常的處理機制

    1、什么是異常處理? 有經驗的朋友應該知道,在正常的CC++編程過程中難免會碰到程序不按照原本設計運行的情況。 最常見的有除法分母為零,數組越界,內存分配失效、打開相應文件失敗等等。 一個程序
    發表于 12-02 07:12

    C/C++代碼靜態測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項目的相對/根路徑的支持。C++?分析也得到了增強,增加了用于檢測 C++?并發問題的新檢查,并改進了實體名稱和實
    的頭像 發表于 10-13 18:11 ?542次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態測試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時,你會發現Python和Scratch是許多任務(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發表于 08-06 15:33 ?4044次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹莓派上哪種語言更優?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯網項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發表于 07-24 15:32 ?897次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹莓派上哪種語言更優?

    適用于SystemC/C++驗證的形式化解決方案

    雖然 SystemC/C++ 編程風格已使用多年,但最近出現了一些特定使用模式,它們推動工程團隊采用共同的設計流程。這包括抽象算法設計代碼用作高層次綜合 (HLS) 工具的輸入,虛擬平臺模型用于早期軟件測試,可配置的知識產權 (IP) 模塊,等等。
    的頭像 發表于 06-24 11:07 ?1236次閱讀
    適用于SystemC/<b class='flag-5'>C++</b>驗證的形式化解決方案

    主流的 MCU 開發語言為什么是 C 而不是 C++

    在單片機的地界兒里,C語言穩坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉。先說內存這道坎兒。您當stm32f4的256kRAM
    的頭像 發表于 05-21 10:33 ?1008次閱讀
    主流的 MCU 開發語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    NCA9555 具有16位通用并行I2C總線數輸入輸出GPIO擴展功能

    NCA9555是一款24引腳CMOS器件,提供16位通用并行I2C總線數輸入/輸出GPIO擴展功能。它和ACPI電源開關,傳感器,按鍵,LED和風扇等應用的額外I/O口需求提供了簡單的解決方案
    發表于 05-19 18:02 ?0次下載

    C++學到什么程度可以找工作?

    C++學到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發人員或相關職位,通常需要掌握以下幾個方面: 1. **語言基礎**:你需要對C++的核心概念有扎實的理解,包括但不限于指針、內存
    發表于 03-13 10:19

    創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結果與Python代碼不同是為什么?

    創建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結果與 Python* 代碼不同。
    發表于 03-06 06:22

    為什么無法使用多個互聯網協議 (IP) 攝像頭作為多通道人臉檢測的輸入C++演示?

    用于兩個 IP 攝像頭的命令作為 多通道人臉檢測的輸入C++演示:-i rtsp://admin:gamma@172.18.70.113:8554/CH001.sdp/ rtsp://admin
    發表于 03-05 09:17