做者 謝恩銘,公衆號「程序員聯盟」(微信號:coderhub)。 轉載請註明出處。 原文:www.jianshu.com/p/d44bd24ce…html
《C++探索之旅》全系列前端
上一課是 C++探索之旅 | 第一部分第二課:C++編程的必要軟件 。ios
通過上兩課以後,咱們已經知道了什麼是編程,編程的語言,編程的必要軟件,C++ 是什麼。git
咱們也安裝了適合本身的 IDE(Integrated Development Environment,就是「集成開發環境」的意思)。程序員
除了使用 IDE 以外(IDE 集成了文本編輯器,編譯器,調試器,運行程序,等),也能夠選擇另外一種難一些的方式:本身用某一種文本編輯器來編寫 C++ 代碼,用 g++(GNU 項目的 C++ 的編譯器)來編譯程序,而後用命令行來運行程序。github
推薦幾個不錯的文本編輯器:Vim,Emacs,Sublime Text,Atom,VS Code(如今 VS Code 很是火,經過安裝各類插件能夠成爲 IDE),等。面試
以上幾個文本編輯器,我都用過。Sublime 只用了一會,Vim 和 Emacs 用得比較多,Atom 也不錯,微軟出的 VS Code 也挺好的。正則表達式
我之前寫了一篇專門介紹 Emacs 的文章, Emacs,最強編輯器,沒有之一 。固然,這個標題有點誇張了,哈哈。其實我如今工做中仍是用 Vim 比較多。編程
這一課咱們就來介紹命令行程序,用 IDE 或 文本編輯器編寫第一個 C++ 程序,以及講解 C++ 程序的基本原理吧。windows
這個標題是否是有點玄乎:命令行還有奇幻可言?什麼是命令行?
咱們會一一解釋。
也許提及編寫第一個程序,你們會很激動,期待幹一番大事業。
可是,遺憾的是,咱們這一課可不會帶你們開始編寫《星際爭霸》這樣的遊戲(固然個人實力也遠遠夠不上... 那須要一個專業團隊耗費不少年才能完成),也不會來寫一個瀏覽器,或者視頻播放器,等等。
咱們會「慢條斯理」地前進,由於咱們要作到的是「踏實」,由於即便是編寫《星際爭霸》的暴雪團隊中的編程精英,也是從最基礎的編程知識學起的。
首先,咱們來講一說什麼是命令行程序。
咱們須要知道,有兩種類型的程序:命令行程序 和 圖形界面程序。
圖形界面程序
簡單來講,圖形界面程序就是「顯示窗口的程序」。
有過 Windows 使用經驗的朋友確定對這樣的程序不陌生,由於就連微軟的 Windows 操做系統的 "Windows"(window 是英語「窗、窗戶」的意思,windows 是 window 的複數)這個英語單詞的意思就是「視窗」,Windows 操做系統其實應該翻成「視窗操做系統」。
因此咱們平時也就是在操做形形色色的「窗口」,好比 Chrome 瀏覽器,火狐瀏覽器,QQ,微信,迅雷,視頻播放器,等等。想想,是否是這些程序都有一個「窗口」做爲最外邊的框架?咱們能夠打開窗口,關閉窗口,調節窗口大小,操做窗口內部的按鈕,等等。
這樣的程序,專業術語叫作 GUI 程序。GUI 是 Graphic User Interface 的首字母縮略詞,表示「圖形用戶界面」。
例以下圖中,咱們能夠看到咱們所熟知的 Office Word 軟件:
命令行程序
注意:真正的命令行界面應該是徹底沒有圖形的,就是一個只能輸入命令,並且一般是黑色背景,白色字體的「大黑洞」。 咱們如下舉例的時候所說的命令行程序,其實大可能是在圖形界面內建立一個窗口,此窗口內就像是命令行界面的屏幕同樣,一般稱爲「終端」(Terminal)。
在 Unix 或者 Linux 系統下(能夠看個人另外一個系列教程 Linux探索之旅 ),命令行程序相對 Windows 和 macOS 來講用得更多一些。
Windows 裏面也有命令行程序,就是你們可能使用過的 cmd.exe 程序(在 Windows 下按 【Windows 鍵(鍵盤左下角有微軟圖標的按鍵)+ 字母鍵 R 】, 而後輸入 cmd
,回車,就能夠調出),它實際上是微軟 的 Windows 系統基於 Windows 上的命令解釋程序,相似於微軟的 DOS 操做系統。以下圖:
macOS 裏也有 Unix 範式的命令行解釋器:
看了 Windows 和 macOS 下的命令行程序,再來看一下咱們 Linux(用 Ubuntu 這個 Linux 發行版來作例子)的命令行程序:
雖然說終端或者命令行界面看起來比圖形界面「難看」,你們會說「土啊」... 畢竟這年頭,你們都喜歡「高顏值」的圖形界面程序麼。
可是不可諱言,命令行程序是有其獨到的優點的。若是命令行沒點絕活,哪能受到咱們程序員的青睞。
命令行有以下優點:
可實現圖形界面不具備的功能:Linux 的不少程序是面向命令行的,沒有圖形前端,只能用命令行使用。
可以使用超級用戶權限:一些須要超級用戶權限的操做只能在命令行下運行。
高效快速:可藉助正則表達式實現批量處理,還能向程序發送參數。
安全性高:可減小因錯誤操做或者權限問題致使的風險。
不少程序員要的就是這個 feel,倍兒爽~
命令行程序中,咱們只能使用鍵盤輸入命令,鼠標通常是沒什麼做爲的。文字信息是按從上到下,從左到右的順序顯示。
咱們的首期目標:命令行程序
咱們將從命令行程序開始,一點點學習 C++ 的各樣知識點。
我知道,雖然掃了在座各位的興致,命令行界面顏值不夠高,可是相對圖形界面卻更容易建立,特別對於初學編程的朋友來講。
固然了,以後的課程咱們能夠在學習完了 C++ 的基本知識點後,用 Qt 這個 C++ 庫來編寫圖形界面的程序,會有不少好玩的程序等待咱們去實現。
不過你們也不要怕,咱們並不須要通過堅苦卓絕的「八年抗戰」纔可以資格編寫圖形界面的程序。
好了,說了這麼多「廢話」,咱們能夠正式開始 C++ 編程了。
在上一課中,咱們介紹了幾個主流 的 C/C++ 編程 IDE :CLion,CodeBlocks,Visual Studio,Xcode,Eclipse,VS Code(雖然是代碼編輯器,可是能夠經過安裝插件成爲輕量級的 IDE)。
上一課裏咱們演示瞭如何用 CodeBlocks 和 Xcode 建立一個 C++ 項目,沒有演示如何用 VS 建立 C++ 項目,那麼這一課就來演示如何在 Visual Studio 中建立第一個 C++ 項目,並編譯運行。
以後再演示不使用 IDE,而純使用 g++ 命令(對於 Linux 下的用戶來講,最好使用這個方式,比用 IDE 能夠學到更多東西)來編譯,並用命令行來運行。
Visual Studio 建立 C++ 項目
我是用 Visual Studio 2012 來演示。其餘版本的 VS,可能菜單的命名或某些選項窗口會不同,但基本操做應該是相似的。
首先,新建一個項目,有兩種方法,你能夠在初始打開 VS 時,點擊以下圖中的「新建項目」:
或者(比較提倡這種方法,由於不必定每次建立新項目都是剛打開 VS 時)選擇 「文件 -> 新建 -> 項目」 :
用以上兩種方式,均可以調出如下窗口:
選擇默認的 Visual C++ 的 Win32 控制檯程序就行了,項目名字能夠不改,不過我這裏改爲了 HelloWorld
。點擊「肯定」,能夠看到下圖:
點擊「下一步」,出現下圖:
不須要修改,默認配置就好,點擊「完成」。咱們的項目就建立好了:
能夠看到咱們的主要的文件:HelloWorld.cpp。
Windows 生成的 main 函數名字和通常的不太同樣,叫 _tmain。反正和咱們平時的 main 函數是相似的。
咱們添加咱們須要的代碼,以後完整的代碼是這樣:
// HelloWorld.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 在屏幕上顯示"Hello World!"
cout<<"Hello World!"<<endl;
return 0;
}
複製代碼
至此,咱們的主要程序就寫好了。咱們來編譯運行吧。
首先,編譯代碼。點擊 生成->生成解決方案 (也能夠按快捷鍵 F7):
稍等片刻,VS 的下方會顯示:
顯示「生成:成功」,則表示咱們的程序編譯成功了。
接下來運行程序,點擊 調試 -> 開始執行(不調試)(也能夠按 Ctrl + F5):
程序運行的結果是輸出「Hello World!」,以下圖:
經過簡單的幾個步驟、短短的幾行代碼,就建立了咱們的第一個 C++ 程序,並實現了「Hello World! 」輸出。用 C++ 編程就這麼簡單!
命令行建立 C++ 項目
看過了用 IDE 來建立 C++ 程序的實例,咱們來學習一下對於初學者,特別是沒接觸過 Linux(一個操做系統,如今主流的操做系統有 Windows,macOS 和 Linux)命令行的朋友來講比較複雜的方式。若是你徹底沒有 Linux 或 Unix 基礎,能夠跳過此節,就用 IDE 也行。固然你也能夠經過搜索一些知識來完成這一節。
首先,把以前的主要程序用文本編輯器(隨便你用那個文本編輯器,Nano,Gedit,Vim,Emacs,Sublime Text,Atom,VS Code,等)編寫,而後保存爲 HelloWorld.cpp 這個文件。
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
return 0;
}
複製代碼
而後,咱們在 Linux 系統下啓動終端(Terminal),通常能夠在「應用->附件->終端」,點擊啓動。
或者像 Ubuntu 這樣的 Linux 發行版,能夠同時按 Ctrl + Alt + T 這三個鍵來快捷啓動終端,終端是長這個樣子的:
下面演示的命令,是在 Ubuntu 系統下執行的:
sudo apt-get install g++
複製代碼
cd "HelloWorld.cpp 這個文件所在的路徑"
複製代碼
個人 HelloWorld.cpp 文件就存放在家目錄下,因此直接用 cd ~
或 cd
命令就能夠。
g++ HelloWorld.cpp -o HelloWorld
複製代碼
上面的 -o
參數裏的 o 是 output(英語「輸出」的意思)的縮寫,就是說「用 g++ 編譯 HelloWorld.cpp 這個 C++ 文件,生成的可執行程序名字是 HelloWorld」。
./HelloWorld
複製代碼
若是你在第 3 步編譯的時候不用 -o 參數來指定生成的可執行程序名字,g++ 會爲你設置一個默認的名字,可能會叫 a.out。以下圖所示:
雖然咱們建立了一個項目,可是這個項目很簡單,只有一個主要文件,就是 HelloWorld.cpp,它的主要內容以下:
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
複製代碼
對於第一次接觸編程的朋友,可能這個最基礎的代碼也是難以理解。
因此咱們纔要一塊兒來學習如何閱讀這段代碼。
先從第一行開始吧:
#include <iostream>
複製代碼
這一行很特別,咱們會在源代碼開頭的地方見到這樣的以 #
號開頭的語句。像這樣特別的行,稱爲「預編譯指令」。
這個術語聽起來有點複雜。預編譯指令會在編譯開始的時候,被一種叫作「預編譯器」的程序所讀取。
其實編譯器爲咱們作不少事情,以後的課程會詳細來講明。
可是這一行究竟是什麼意思呢?
這裏的 #
號是預編譯指令開始的標誌,沒有什麼特別的含義,後面接着的 include
是英語「包含」的意思,因此這句話的意思就是在咱們的程序裏包含 iostream
這個文件,這個文件在 C++ 的系統的庫裏已經存在了,這些文件被稱爲庫文件。
iostream 是英語 Input Output Stream(輸入輸出流)的簡稱。一般,電腦的輸入流是鍵盤和鼠標,輸出流是屏幕。
因此 iostream 這個標準庫頭文件裏面就定義了操做輸入輸出流相關的全部函數等。
以後的課程,當咱們要編寫圖形界面程序時,咱們會使用 Qt 這個 C++ 的第三方庫。而咱們會在程序裏引入 Qt 這個頭文件的內容,以下:
#include <Qt>
複製代碼
固然了,咱們每次能夠 include 好多個頭文件。
命名空間:namespace
接着咱們看到第二句話:
using namespace std;
複製代碼
這又是什麼呢?
咱們來介紹一下命名空間(namespace)的概念:
命名空間告訴編譯器去哪裏找咱們所調用的東西。
聽着有點暈?命名空間有什麼用呢?
例如,你用 #include
語句引入了好多個庫,而這些庫裏有的函數是重名的。假設在 iostream 庫中咱們定義了 DoSomething 這個函數,而在 Qt 這個第三方庫中也定義了相同名字的函數,也叫 DoSomething。那編譯器就不知道用哪一個庫裏面所定義的 DoSomething 函數了。
using 是英語「使用」的意思,因此這句話的意思就是「使用 std 命名空間的東西」。
std 這個命名空間是很經常使用的,由於它指明瞭「標準命名空間」(std 是 standard 的縮寫,表示「標準」)。咱們的 iostream 就是屬於 std 命名空間的。
接着,咱們看到了下面的語句:
int main() {
cout << "Hello World!" << endl;
return 0;
}
複製代碼
以上咱們所看到的語句塊,被稱爲函數(function)。其實 C++ 語言的程序基本就是由函數來構成的。目前咱們的程序只有一個函數。
咱們如今還不會講不少函數的細節,由於那是之後【函數】那一課的內容,如今還早。可是咱們會大致說一下函數的組成。
第一行包含了函數的名字,是第二個單詞:main
。main 表示「主要的」,因此這裏的函數被稱爲 main 函數,也就是主函數。main 函數是一個特殊的函數,C++ 的程序執行老是從 main 函數開始。
一個函數有開始和結束,使用大括號 {}
來標識。因此咱們的 main 函數包含如下兩行代碼
cout << "Hello World!" << endl;
return 0;
複製代碼
這些在函數裏的行也有名字,被稱爲「指令」(instruction)。每一條指令都會讓電腦作特定的事情。一個函數大致來講是用來集中必定數目的指令。好比咱們能夠建立一個函數叫作「打開文件」,這個函數會讓電腦爲你打開某個文件。
函數的優點就是當你寫好了這個函數以後,你只須要使用(專業術語叫作 「調用」)「打開文件」這個函數,電腦就會爲你執行函數裏面的指令。你不須要每次在要實現「打開文件」功能的地方都重複寫那些指令。
函數能夠大大節約代碼空間,增長利用率,提升效率。
這一行指令
cout << "Hello World!" << endl;
複製代碼
使得屏幕顯示 Hello World!
這一句話。
它由三部分組成:
cout
:在標準輸出(此處是屏幕)上顯示信息。"Hello World!"
:要顯示的內容。endl
:表示換行。當你的程序執行到這一行時,就在屏幕上顯示相應的信息,而後換行。
cout 相似 C 語言的 printf 函數,是 C++ 裏面負責標準輸出的。不過又有不一樣,咱們能夠看到 cout 後面不是加括號,而是鏈接了 <<
這個特殊的符號。
暫時咱們不深刻,由於 cout 其實不是一個函數,cout 是一個 ostream 類的對象(關於類和對象,咱們以後的課程會講解),它有一個成員運算符函數 operator<<
(涉及到 C++ 的運算符重載的技術,之後的課程會講)。(這一句指令暫時不須要理解,只須要知道這句話的做用)。
cout 的定義是在 iostream 庫的 std 命名空間中,如今你知道
#include <stdio.h>
using namespace std;
複製代碼
這兩句話的重要性了吧?若是沒有引入 iostream 這個庫而且不指明使用哪一個命名空間的話,那咱們的 main 函數就不能調用 std 的 cout。
假如你沒加
using namespace std;
複製代碼
這一句話,那麼調用 cout 時需要加上 std::
這樣的前綴:
#include <iostream>
int main() {
std::cout << "Hello World!" << endl;
return 0;
}
複製代碼
而第二個指令
return 0;
複製代碼
大致上說來就是表示函數結束了,而且返回 0 值。return 是英語「返回」的意思。
爲何咱們的 main 函數返回 0,而不是返回其餘值呢?
實際上,每一個 C++ 語言的程序結束時都會返回一個值,0 表示一切正常結束,其餘的值表示異常。
這裏咱們只是簡單介紹了函數的概念,關於函數的細節請看以後的課程。
在結束這一課前,咱們必須再來說一下註釋(comment)。不論什麼編程語言,咱們均可以在源代碼裏添加註釋。C++ 語言固然不例外。
註釋,究竟是什麼啊 ?
簡單地說,註釋就是在你程序之中用來標註這個程序的做用,某一行代碼的做用等等的文字。註釋真的很重要,由於即便是一個計算機天才,也要在程序中作一些註解。
註釋有以下做用:
在以後閱讀本身寫的代碼時不至於迷失方向。不能否認,在從新閱讀以前寫的代碼時,咱們經常會忘記這個函數是幹什麼的,那個地方爲何要這樣寫。特別是代碼量很大,幾千幾萬行甚至更多時,若是沒有註釋,那閱讀起來會很費力。
若是你把你的代碼給別人閱讀,註釋能夠節省對方理解你的代碼的時間。
要在代碼中插入註釋,有幾種形式:
若是你的註釋比較短,在一行裏就能寫完,那能夠用 //...
這樣的形式。
若是你的註釋跨越好幾行,那能夠用 /* ... */
的形式。
咱們能夠對以前的代碼添加註釋,變成以下:
#include <iostream> // 引入 iostream 這個庫 (爲了使用 cout)
using namespace std; // 指明要使用的命名空間
/*
主函數 main
全部的 C++ 程序都從 main 函數開始
*/
int main() {
cout << "Hello, World!\n" << endl; // 在屏幕上顯示 "Hello, World!",而且換行
return 0; // 結束 main 函數,也就是結束程序
}
複製代碼
能夠看到,雖然程序行數變多了,但註釋卻使咱們的代碼變得易讀不少。
編譯代碼的時候,編譯器會忽略全部的註釋。這些註釋不會出如今最終的程序裏,只是爲程序員本身和閱讀程序的其餘人服務的。
記住: 註釋要起到引導閱讀代碼的做用,以便理清頭緒。可是不要在太過淺顯易懂的地方添加註釋。
引用 IBM 公司的一句格言: 「若是一個程序,在你僅僅看完它的註釋以後,你不能瞭解它的做用,那麼把這個程序扔了吧。」 -- 大公司就是這麼嚴格,這麼任性。
代碼整潔之道
其實咱們的程序徹底能夠寫成這樣,也是正確的,能夠編譯運行,輸出 Hello World!
。
#include <iostream>
using namespace std; int main()
{
cout << "Hello world!"<< endl; return 0; }
複製代碼
由於編譯器並不介意你的程序是否是「規範」。
但這樣的程序問題是什麼呢?
「亂七八糟」,能夠這麼形容。由於這樣的程序風格使得別人很不容易閱讀你的代碼,甚至過了一段時間可能你本身也會摸不着頭腦。
若是你去面試,寫出這樣的程序,那九成是不會被錄取的。除非你參加「國際 C 語言亂碼大賽(IOCCC)」。
因此一開始就養成良好的代碼風格是很重要的。
推薦你們去看林銳編寫的 《高質量 C++/C 編程指南》 。
其實我我的更喜歡直接參考 Google 公司的 C++ 代碼規範:google.github.io/styleguide/…
有兩種程序:命令行程序 和 圖形界面程序。
剛開始學編程,實現命令行程序更簡單。因此咱們從命令行程序開始學習。
一個 C++ 程序老是有 main 函數:這是程序運行的入口。
cout 能夠在屏幕上顯示信息。
咱們能夠給程序添加註釋,以詳述其做用。C++ 中的註釋有兩種形式:// 註釋
或者 /* 註釋 */
。
今天的課就到這裏,一塊兒加油吧!
下一課咱們學習:C++探索之旅 | 第一部分第四課:內存,變量和引用
我是 謝恩銘,公衆號「程序員聯盟」(微信號:coderhub)運營者,慕課網精英講師 Oscar 老師,終生學習者。 熱愛生活,喜歡游泳,略懂烹飪。 人生格言:「向着標杆直跑」