? ? ? ? C++ Primer第一章的內容相對來說比較基礎,主要是對C++中程序編譯的流程、C++中的IO機制,for和while循環的介紹、類的構成和注釋方法及縮進方法做了簡要的介紹,本次博客主要從C++中的IO機制和注釋縮進等方面做一個總結記錄,如果在總結過程中有需要補充或者錯誤的地方,歡迎各位博主指正和交流。
1、C++中的IO機制
? ? ? ? 和C語言中使用函數來實現輸入輸出不同,C++采用標準庫文件iostream來實現IO機制(輸入輸出流機制:隨著時間推移,字符順序生成或消耗),其中庫文件iostream又拆分成輸入流istream(定義了輸入流cin(運算符為>>),本質是istream的一個對象)和輸出流ostream(定了標準輸出流cout(運算符為<<),標準錯誤流cerr(警告和錯誤)和一般消息clog)。
? ? ? ? 在實際的編程過程中,可以使用istream輸入流對象作為判斷條件,其效果是檢測流的狀態是否有效。當遇到文件結束符(EOF,unix系統中采用ctrl+D生成文件結束符,Windows中采用的是ctrl+Z)或者無效輸入時(即定義的變量類型和輸入的變量類型不一致)時,istream流狀態無效。
注意事項:如果定義賦值的數據類型為char/string類型,那么ctrl+D會被認為是輸入了一個字符,因此輸入流狀態依然有效。如果定義賦值的數據類型為int,則ctrl+D會被認為是無效輸入,程序終止。正確的做法是在對應的系統中使用相對應的文件結束符。
? ? ? ? C++在實現IO機制時,采用緩沖區的工作原理,通過緩沖區來保存數據,從而實現讀寫操作。在數據讀寫的過程中,讀寫緩沖區的動作與程序中的動作是無關的,我們可以采用操縱符(如endl)來顯示刷新輸出緩沖中的數據到輸出設備中。默認狀態下,讀cin會刷新cout;程序非正常終止時也會刷新cout。
***緩沖區小結(參考博客:https://www.cnblogs.com/limera/p/buffer.html)
緩沖區分為:全緩沖(填滿緩存之后才能進行IO操作,如磁盤文件的讀寫),行緩沖(遇到換行符執行IO操作,如鍵盤輸入數據)和不帶緩存(如標準出錯stderr,為了讓錯誤盡快顯示出來)
緩存區的刷新:緩存區滿時,執行flush和endl(等價于\n+flush)等操縱符,關閉文件。
2.注釋及縮進
? ? ? ? ?在軟件開發的過程中,需要對程序代碼進行相應的注釋。注釋的作用是用來概述算法的功能,確定變量的具體用途,解釋具體的代碼段。注釋對于編譯器而言會被忽略,但對其他程序員閱讀和自己以后的整體有著很大的幫助,因此寫好代碼注釋也是稱為一名合格程序員的基本功。
? ? ? ? ?對于代碼注釋,應該遵從以下兩條原則(自己總結的,如果有更好的經驗,歡迎在博客下面留言):1)注釋存儲關鍵數據的變量,并說明變量的意義;2)不要去解釋代碼做了什么,而去解釋為什么這么做。
? ? ? ? ?C++的注釋方法有兩種:1)采用單行注釋,以“//”開始,換行符結束;2)界定符注釋,即以“/*”開始,以“*/”結束,采用界定符注釋時,可以注釋多行,注釋多行時最好在每行的前面加上“*”,方便顯示注釋的范圍,同時界定符注釋不支持嵌套注釋。
? ? ? ? ?VS中注釋和取消注釋的快捷鍵為:1)注釋快捷鍵:ctrl+K,ctrl+C;2)取消注釋:ctrl+K,ctrk+U。
? ? ? ? ?對于C++而言,格式在很大程度都是比較自由的,但有一點需要主要的是:對于函數而言,花括號必須是形參列表后第一個非空、非注釋的字符。
***內容補充1:換行符\n和endl區別?
參考博客:http://www.cnblogs.com/taqikema/p/7743914.html
? ? ? ? ? 換行符的作用在于將輸入寫入到緩存區中(如行緩存,遇到換行才執行IO操作)或顯示實現換行的目的;而endl的作用在于先實現換行操作,而后實現刷新緩存區。一般情況下,不加endl也能夠正常輸出數據,因為系統在空閑的過程(沒有一個合適的界限)中會查看緩存區的內容,如果發現有新的數據,則會進行輸出。
但是,不能在任何的情況下都是用endl,因為不停地刷新緩存區,會降低程序的運行效率,因此等根據具體情況具體分析。
***內容補充2:未初始化的變量小結
? ? ? ?類類型變量如果沒有指定初值,則按類定義指定的方式或系統默認的方式進行初始化。定義在函數內部的內置類型變量默認是不初始化的,除非有顯示的初始化語句。試圖使用一個未初始化變量的值是錯誤的,會產生對應的bug。
****內容補充3:術語中英文對照表
參數(argument)賦值(assignment)程序塊(block)緩沖區(buffer)內置類型(built-in type)字符串字面值常量(character string literal)類(class)類類型(class type)注釋(comment)條件(condition)花括號(curly brance)數據結構(data structure)編輯-編譯-調試(edit-compile-debug)文件結束符(end-of-file)表達式(expression)fot/while/if語句(for/while/if statement)函數(function/body/name)頭文件(header)初始化(initialize)庫類型(library type)操縱符(manipulator)成員函數(member function)方法(method)命名空間(namespace)形參列表(parameter list)返回類型(return type)源文件(source file)標準錯誤/輸入/庫/輸出(standard error/input/library/output)未初始化的變量(uninitialized variable)運算符(operator)