作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)。
轉(zhuǎn)載請(qǐng)注明出處。
原文:http://www.itdecent.cn/p/c73fecacd006
《C語言探索之旅》全系列
內(nèi)容簡(jiǎn)介
- 前言
- 控制臺(tái)程序還是窗口程序
- 最基礎(chǔ)的代碼
- 特殊字符
- 注釋,很有用
- 總結(jié)
- 第一部分第四課預(yù)告
1. 前言
在上一課 C語言探索之旅 | 第一部分第二課:工欲善其事,必先利其器 中我們說過,你可以用自己喜歡的 IDE,或者用文本編輯器、編譯器和調(diào)試器這樣的組合來學(xué)習(xí)本課程。
不過,我覺得對(duì)于初學(xué)者,還是有必要演示一下某款 IDE 的具體下載和安裝等操作。我就以 Code::Blocks 這款免費(fèi)開源且跨平臺(tái)的 IDE 為例吧。
下載 Code::Blocks
先去 Code::Blocks 的官方下載頁面:http://www.codeblocks.org/downloads/binaries 。
2020 年 3 月 29 日 Code::Blocks 終于更新了 20.03 版(不容易啊,上一次的版本還是 2017 年的),不過可惜的是 macOS 的版本還是停留在 13.12(網(wǎng)站上標(biāo)識(shí)的是 13.12,但實(shí)際安裝之后是 17.12 版)。
Windows 用戶請(qǐng)下載 .exe 的文件,一般來說是下載 codeblocks-20.03mingw-setup.exe 這樣的最新的 .exe 的安裝文件。記得要有 mingw 字樣的,才包含 GCC 編譯器和 GDB 調(diào)試器。
Linux 用戶請(qǐng)下載對(duì)應(yīng)你的操作系統(tǒng)的版本。目前有 Debian、Ubuntu 和 RedHat 系。Ubuntu 可以用 apt 命令來安裝,請(qǐng)看官方文檔。
蘋果 macOS 用戶請(qǐng)下載最新版的 dmg 文件,例如 CodeBlocks-13.12-mac.zip。不過這個(gè)版本有點(diǎn)舊了,可能會(huì)有 bug。
安裝運(yùn)行 Code::Blocks
Code::Blocks 的安裝很簡(jiǎn)單,和安裝 QQ 這樣的普通軟件沒多大區(qū)別,一路默認(rèn)到底就好。
安裝完之后雙擊運(yùn)行,你可以看到類似下圖的界面:

上圖中標(biāo)注了四個(gè)區(qū)域:
- 工具欄:有很多按鈕,但只有幾個(gè)是我們時(shí)常用到的。
- 項(xiàng)目文件列表區(qū):左邊的欄里面顯示了你的項(xiàng)目的所有文件。
- 主界面:寫代碼的地方。
- 通知欄:會(huì)看到運(yùn)行的錯(cuò)誤,編譯的問題,等等。
那么,如何創(chuàng)建一個(gè) C語言基本的控制臺(tái)應(yīng)用程序呢?
首先到菜單里,依次點(diǎn)擊“File -> New -> Project”,

會(huì)打開類似如下的窗口:

可以看到,Code::Blocks 支持非常多的程序類型,這些程序類型用到不同的庫,比如 SDL(開發(fā) 2D 程序),OpenGL(開發(fā) 3D 程序),Qt 和 wxWidgets,等等。甚至還支持 Arduino、ARM 這樣的嵌入式項(xiàng)目。
目前,這些圖標(biāo)很多都只是好看而已,因?yàn)槟氵€沒安裝對(duì)應(yīng)的庫,所有不能用。
暫時(shí)我們只用最基本的 Console application(表示“控制臺(tái)應(yīng)用”,簡(jiǎn)單來說就是會(huì)彈出一個(gè)框,里面顯示程序運(yùn)行的結(jié)果,你也可以輸入東西)。
選擇 Console application,點(diǎn)擊 Go 按鈕到下一步:

這一步是讓你選擇要使用的編程語言,有 C 和 C++ 兩個(gè)選項(xiàng),我們選擇 C,表示要?jiǎng)?chuàng)建的是 C語言的項(xiàng)目。然后點(diǎn)擊 Next 進(jìn)入下一步:

Project Title 里面填寫你要?jiǎng)?chuàng)建的項(xiàng)目名稱,我們填的是著名的 HelloWorld。Folder to create project in 是選擇項(xiàng)目存放的路徑。
Project filename 是指項(xiàng)目文件名稱,可以看到是 .cbp 結(jié)尾的文件類型,cbp 是 Code Blocks Project 的首字母縮寫,表示“Code::Blocks項(xiàng)目”。
點(diǎn)擊 Next 到下一步:

這里我們不必更改什么,默認(rèn)就好。點(diǎn)擊 Finish(“完成”)結(jié)束配置,Code::Blocks 就會(huì)創(chuàng)建你的第一個(gè)項(xiàng)目了。
打開 Sources 里的 main.c 這個(gè) C語言的源代碼文件。點(diǎn)擊上面工具欄里有一個(gè)綠色的三角形按鈕,是用于運(yùn)行程序,它會(huì)提示你是否要編譯,點(diǎn)擊 yes(當(dāng)然了,你也可以點(diǎn)擊綠色三角形邊上的帶齒輪的綠色三角形按鈕,是用于“編譯再運(yùn)行”),運(yùn)行起來后我們的第一個(gè)控制臺(tái)程序輸出:
Hello world!

2. 控制臺(tái)程序還是窗口程序
現(xiàn)在,既然我們已經(jīng)把舞臺(tái)都搭好了,該是時(shí)候把我們的主角 C語言請(qǐng)出來了。我們將一起來寫第一個(gè) C語言程序。
當(dāng)然了, 這個(gè)程序會(huì)是黑白的,也不會(huì)跟你打招呼,更不會(huì)幫你泡咖啡??赡茱@得毫無用處,但卻是你的第一個(gè)程序,我保證你會(huì)有成就感的。
我們?cè)?Code::Blocks 這個(gè) IDE 中看到,當(dāng)你要?jiǎng)?chuàng)建一個(gè)項(xiàng)目時(shí),IDE 會(huì)問你是創(chuàng)建 console(控制臺(tái))程序還是 window(窗口)程序。
之前我們?yōu)榱丝焖傺菔?,選擇的是控制臺(tái)程序。
其實(shí)只有這兩種類型,沒有其他的了:
- 窗口程序
- 控制臺(tái)程序
先來介紹一下窗口程序,因?yàn)楸容^直觀,比較漂亮,顏值爆表。
這樣的程序你肯定見到過,下圖對(duì)大多數(shù)人來說很熟悉吧。

是的,上圖就是 Windows 系統(tǒng)的畫圖程序。它是一個(gè)窗口程序,就是有窗口的程序(有時(shí)候不止一個(gè)窗口)。我想你肯定想學(xué)習(xí)創(chuàng)建這樣的程序,但是如果你是第一次接觸編程,那有點(diǎn)難。
一開始還是最好從 console(控制臺(tái))程序入門。
那么,所謂的控制臺(tái)程序長(zhǎng)什么樣呢?
最初的程序都是控制臺(tái)程序,因?yàn)槟莻€(gè)年代電腦還只能顯示黑白色,而且也沒有強(qiáng)大到可以運(yùn)行窗口程序,不像今天的電腦。
當(dāng)然了,時(shí)代在進(jìn)步。Microsoft(微軟)公司的 Windows 系統(tǒng)使得電腦能被廣大群眾使用,就是因?yàn)樗僮骱芎?jiǎn)單,幾乎所有操作都可以用窗口程序完成。
Windows 實(shí)在是太流行了,以至于大多數(shù)人都不知道 console(控制臺(tái))程序長(zhǎng)什么樣。不過,我有一個(gè)好消息:“控制臺(tái)程序并沒有死!”
實(shí)際上,Linux 操作系統(tǒng)給很多的人展示了控制臺(tái)程序的魅力,下圖就是 Linux 下的控制臺(tái)程序的截圖:

看上去還不錯(cuò),是嗎?好了,現(xiàn)在你已經(jīng)對(duì)控制臺(tái)程序有了初步概念了。
有一些注意點(diǎn):
- 今天電腦已經(jīng)可以顯示彩色了,所以上面看到的控制臺(tái)也不是完全黑白的了。
- 對(duì)于初學(xué)編程的人來說,控制臺(tái)還是令人不太適應(yīng)的。
- 如果我們掌握了這個(gè)工具,可以用它來做很多事情。
就如我們上面提到的,創(chuàng)建像上圖中的控制臺(tái)程序,其實(shí)很簡(jiǎn)單,而且非常適合初學(xué)者?,F(xiàn)在的控制臺(tái)程序不僅可以顯示彩色,而且如果你要給它設(shè)置一個(gè)背景圖片,也是可以辦到的。
說了這些,那是不是只有 Linux 才有控制臺(tái)程序,Windows 就沒有呢?
當(dāng)然也有,在 Windows 中它被稱為 cmd,也就是 command(表示“命令”)的縮寫,也稱為“命令提示符”,是 Windows 環(huán)境下的虛擬 DOS 窗口。只不過它比較隱秘??梢杂靡韵聝煞N把它請(qǐng)出來:
- 點(diǎn)擊“開始 -> 搜索 -> 輸入“cmd”,然后按回車鍵,或點(diǎn)擊“確定”。
- 用組合鍵 win+R 調(diào)出 (win 鍵就是鍵盤最下面從左邊數(shù)第二個(gè)鍵,上面有個(gè) Windows 系統(tǒng)標(biāo)志的),再輸入 cmd,然后按回車鍵,或點(diǎn)擊“確定”。


上圖就是 Windows 里面奇妙的控制臺(tái)。
當(dāng)然了,蘋果的 macOS 操作系統(tǒng)中,我們也可以打開控制臺(tái)的,只要運(yùn)行 Terminal 這個(gè)系統(tǒng)自帶的應(yīng)用程序:

3. 最基礎(chǔ)的代碼
對(duì)于 C語言的每一個(gè)程序,我們都要輸入最基礎(chǔ)的幾行代碼。這幾行代碼不是太特別,但是必不可少。
我們現(xiàn)在就來看看“最基礎(chǔ)的代碼”長(zhǎng)什么樣。
讓 IDE 為我們生成“最基礎(chǔ)的代碼”
之前我們已經(jīng)演示了,Code::Blocks 會(huì)為我們生成 C語言程序的最基礎(chǔ)代碼,如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}

其中
int main()
這一行也可以寫成
int main(int argc, char *argv[])
兩種寫法都是可以的,不過第二種(復(fù)雜一些的)更常用,也更專業(yè)。以后的課程我們會(huì)用 int main(int argc, char *argv[]) 這種形式。
分析最基礎(chǔ)的代碼
對(duì)于第一次接觸編程的朋友,可能這個(gè)最基礎(chǔ)的代碼也是令人難以理解。
所以我們才要一起來學(xué)習(xí)如何閱讀代碼。
先從前兩行開始吧:
#include <stdio.h>
#include <stdlib.h>
這兩行很特別,我們會(huì)在源代碼開頭的地方見到這樣的以 # 號(hào)開頭的語句。像這樣特別的行,稱為預(yù)編譯指令。
這個(gè)術(shù)語聽起來有點(diǎn)復(fù)雜。預(yù)編譯指令會(huì)在編譯開始的時(shí)候,被一種叫做預(yù)編譯器的程序所讀取。
其實(shí)編譯器為我們做很多事情,我們之后的課程會(huì)詳細(xì)來說明。
但是這兩行到底是什么意思呢?
這里的 # 號(hào)是預(yù)編譯指令開始的標(biāo)志,沒有什么特別的含義,后面接著的 include 表示“包含”,所以這兩句話的意思就是在我們的程序里包含 stdio.h 和 stdlib.h 這兩個(gè)文件,這兩個(gè)文件在系統(tǒng)的庫里已經(jīng)存在了,這些文件被稱為庫文件。
如果沒有這兩句話,那我們就不能在程序里調(diào)用這兩個(gè)文件定義的東西了。
接著,我們看到了下面的語句:
int main()
{
printf("Hello world!\n");
return 0;
}
以上我們所看到的語句塊,被稱為函數(shù)。其實(shí) C語言的程序基本就是由函數(shù)來構(gòu)成的。所以目前我們的程序只有一個(gè)函數(shù)。
我們現(xiàn)在還不會(huì)講很多函數(shù)的細(xì)節(jié),因?yàn)槟菍⑹呛竺娴暮瘮?shù)那一課的內(nèi)容,現(xiàn)在還早。但是我們會(huì)大體說一下函數(shù)的組成。
第一行包含了函數(shù)的名字,是第二個(gè)單詞 main。所以這里的函數(shù)稱為 main 函數(shù)。這是一個(gè)特殊的函數(shù),程序執(zhí)行總是從 main 函數(shù)開始。
一個(gè)函數(shù)有開始和結(jié)束,使用大括號(hào) {} 來標(biāo)識(shí)。所以我們的 main 函數(shù)包含以下兩行代碼
printf("Hello world!\n");
return 0;
這些在函數(shù)里的行也有名字,被稱為指令。每一條指令都會(huì)讓電腦做特定的事情。一個(gè)函數(shù)大體來說是用來集中一定數(shù)目的指令。比如我們可以創(chuàng)建一個(gè)函數(shù)叫做“打開文件”,這個(gè)函數(shù)會(huì)讓電腦為你打開某個(gè)文件。
函數(shù)的優(yōu)勢(shì)就是當(dāng)你寫好了這個(gè)函數(shù)之后,你只需要使用(專業(yè)術(shù)語叫做調(diào)用)“打開文件”這個(gè)函數(shù),電腦就會(huì)為你執(zhí)行函數(shù)里面的指令。你不必每次在需要實(shí)現(xiàn)“打開文件”功能的地方都重復(fù)寫那些指令。函數(shù)可以大大節(jié)約代碼空間,提高效率。
printf("Hello world!\n");
這一行指令使得屏幕顯示 "Hello World!"(表示“你好,世界!”)這一句話。當(dāng)你的程序執(zhí)行到這一行時(shí),就在屏幕上顯示相應(yīng)的信息。然后會(huì)執(zhí)行下一個(gè)指令。
printf 也是一個(gè)函數(shù),定義在 stdio 庫中,現(xiàn)在你知道
#include <stdio.h>
這句話的重要性了吧,如果沒有引入 stdio 這個(gè)庫,那我們的 main 函數(shù)就不能調(diào)用 printf 這個(gè)函數(shù)。
第二個(gè)指令 return 0; 大致就是表示函數(shù)結(jié)束了,并且返回 0 值。
那么,為什么我的函數(shù)返回 0,不是返回其他值呢?
實(shí)際上,每個(gè) C語言程序結(jié)束時(shí)都會(huì)返回一個(gè)值,0 表示一切正常結(jié)束,其他的值表示異常。
這里我們只是簡(jiǎn)單介紹了一下函數(shù)的概念。關(guān)于函數(shù)的細(xì)節(jié),請(qǐng)期待之后的課程。
測(cè)試你的程序
在 Code::Blocks 里面編譯(Build / Compile)并運(yùn)行(Run) 你的最基礎(chǔ)代碼。得到如下結(jié)果

可以看到你的第一個(gè)程序在屏幕上顯示了 "Hello world!"。
下面的那幾行文字是 Code::Blocks 生成的,表示程序順利執(zhí)行,并且耗時(shí) 0.297 秒。
"Press any key to continue"這句話是讓你按鍵盤上的任意鍵來退出控制臺(tái)程序。
4. 特殊字符
特殊字符的作用是用來表示“換行”,“隔開一個(gè)制表符的空間”,等等。
特殊字符很好辨認(rèn),經(jīng)常是兩個(gè)字符的組合,第一個(gè)字符是反斜杠(\),第二個(gè)字符是一個(gè)數(shù)字或者一個(gè)字母。
下面的兩個(gè)特殊字符是我們經(jīng)常會(huì)用到的:
-
\n:換行符 (作用類似按回車鍵)。 -
\t:制表符 (作用是空出幾個(gè)空格??崭竦臄?shù)目可以配置)。
5. 注釋,很有用
在結(jié)束這一課前,我們必須再來講一下注釋。不論什么編程語言,我們都可以在源代碼里添加注釋。C語言當(dāng)然也不例外。
注釋,到底是什么?。?/h4>
簡(jiǎn)單地說,注釋就是在你程序之中用來標(biāo)注這個(gè)程序的作用,某一行代碼的作用,等等的文字。注釋真的很重要,因?yàn)榧词故且粋€(gè)計(jì)算機(jī)天才,也要在某些地方做一些注解。注釋有如下作用:
在之后閱讀自己寫的代碼時(shí)不至于迷失方向。不可否認(rèn),在重新閱讀之前寫的代碼時(shí),我們常常會(huì)忘記這個(gè)函數(shù)是干什么的,那個(gè)地方為什么要這樣寫。特別是代碼量很大,幾千幾萬行甚至更多時(shí),如果沒有注釋,那閱讀起來會(huì)很費(fèi)力。
如果你把你的代碼給別人閱讀,注釋往往可以節(jié)省對(duì)方理解你的代碼的時(shí)間。
要在 C語言的代碼中插入注釋,有幾種形式:
- 如果你的注釋比較短,在一行里就能寫完,那可以用
//...這樣的形式。 - 如果你的注釋跨越好幾行,那可以用
/* ... */的形式。
雖然程序行數(shù)變多了,但是注釋卻使我們的代碼變得易讀很多。編譯代碼的時(shí)候,編譯器會(huì)忽略所有的注釋,這些注釋不會(huì)出現(xiàn)在最終的程序里,只是為程序員服務(wù)的。
記住:
注釋要起到引導(dǎo)閱讀代碼的作用,以便理清頭緒。但是不要在很顯然就能懂的地方添加注釋。
引用 IBM 公司的一句格言:
“如果一個(gè)程序,在你僅僅看完它的注釋之后,你不能了解它的作用,那么把這個(gè)程序扔了吧?!?br> -- 大公司就是這么嚴(yán)格,這么任性。
6. 總結(jié)
- 程序可以通過一個(gè)控制臺(tái)(Console)或者窗口(Window)和用戶交互。
- 對(duì)初學(xué)者來說用控制臺(tái)來編寫第一個(gè)程序要簡(jiǎn)單很多,雖然不太吸引人。
- C語言的程序主要是由分號(hào)結(jié)尾的語句構(gòu)成的。
- 多條指令可以寫在一個(gè)函數(shù)里,就好像包裝在一個(gè)盒子里一樣。
- main 函數(shù)是程序的啟動(dòng)函數(shù),程序運(yùn)行時(shí)會(huì)執(zhí)行 main 函數(shù)里的指令。
- printf 函數(shù)使我們可以在控制臺(tái)的屏幕上顯示信息。
- printf 函數(shù)是定義在一個(gè)庫(Library)中的。庫中經(jīng)常包含不止一個(gè)函數(shù),可以給我們程序調(diào)用。
7. 第一部分第四課預(yù)告
今天的課就到這里,一起加油吧!
下一課:C語言探索之旅 | 第一部分第四課:變量的世界(一),內(nèi)存那檔事
下一課開始,我們一起探尋 C語言的變量的奇幻世界,還會(huì)聊到內(nèi)存哦,有些難度。
我是 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)運(yùn)營(yíng)者,慕課網(wǎng)精英講師 Oscar 老師,終生學(xué)習(xí)者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標(biāo)桿直跑」