作者 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)。
轉(zhuǎn)載請注明出處。
原文:http://www.lxweimin.com/p/c73fecacd006
《C語言探索之旅》全系列
內(nèi)容簡介
- 前言
- 控制臺程序還是窗口程序
- 最基礎的代碼
- 特殊字符
- 注釋,很有用
- 總結
- 第一部分第四課預告
1. 前言
在上一課 C語言探索之旅 | 第一部分第二課:工欲善其事,必先利其器 中我們說過,你可以用自己喜歡的 IDE,或者用文本編輯器、編譯器和調(diào)試器這樣的組合來學習本課程。
不過,我覺得對于初學者,還是有必要演示一下某款 IDE 的具體下載和安裝等操作。我就以 Code::Blocks 這款免費開源且跨平臺的 IDE 為例吧。
下載 Code::Blocks
先去 Code::Blocks 的官方下載頁面:http://www.codeblocks.org/downloads/binaries 。
2020 年 3 月 29 日 Code::Blocks 終于更新了 20.03 版(不容易啊,上一次的版本還是 2017 年的),不過可惜的是 macOS 的版本還是停留在 13.12(網(wǎng)站上標識的是 13.12,但實際安裝之后是 17.12 版)。
Windows 用戶請下載 .exe 的文件,一般來說是下載 codeblocks-20.03mingw-setup.exe 這樣的最新的 .exe 的安裝文件。記得要有 mingw 字樣的,才包含 GCC 編譯器和 GDB 調(diào)試器。
Linux 用戶請下載對應你的操作系統(tǒng)的版本。目前有 Debian、Ubuntu 和 RedHat 系。Ubuntu 可以用 apt 命令來安裝,請看官方文檔。
蘋果 macOS 用戶請下載最新版的 dmg 文件,例如 CodeBlocks-13.12-mac.zip。不過這個版本有點舊了,可能會有 bug。
安裝運行 Code::Blocks
Code::Blocks 的安裝很簡單,和安裝 QQ 這樣的普通軟件沒多大區(qū)別,一路默認到底就好。
安裝完之后雙擊運行,你可以看到類似下圖的界面:
上圖中標注了四個區(qū)域:
- 工具欄:有很多按鈕,但只有幾個是我們時常用到的。
- 項目文件列表區(qū):左邊的欄里面顯示了你的項目的所有文件。
- 主界面:寫代碼的地方。
- 通知欄:會看到運行的錯誤,編譯的問題,等等。
那么,如何創(chuàng)建一個 C語言基本的控制臺應用程序呢?
首先到菜單里,依次點擊“File -> New -> Project”,
會打開類似如下的窗口:
可以看到,Code::Blocks 支持非常多的程序類型,這些程序類型用到不同的庫,比如 SDL(開發(fā) 2D 程序),OpenGL(開發(fā) 3D 程序),Qt 和 wxWidgets,等等。甚至還支持 Arduino、ARM 這樣的嵌入式項目。
目前,這些圖標很多都只是好看而已,因為你還沒安裝對應的庫,所有不能用。
暫時我們只用最基本的 Console application(表示“控制臺應用”,簡單來說就是會彈出一個框,里面顯示程序運行的結果,你也可以輸入東西)。
選擇 Console application,點擊 Go 按鈕到下一步:
這一步是讓你選擇要使用的編程語言,有 C 和 C++ 兩個選項,我們選擇 C,表示要創(chuàng)建的是 C語言的項目。然后點擊 Next 進入下一步:
Project Title 里面填寫你要創(chuàng)建的項目名稱,我們填的是著名的 HelloWorld。Folder to create project in 是選擇項目存放的路徑。
Project filename 是指項目文件名稱,可以看到是 .cbp 結尾的文件類型,cbp 是 Code Blocks Project 的首字母縮寫,表示“Code::Blocks項目”。
點擊 Next 到下一步:
這里我們不必更改什么,默認就好。點擊 Finish(“完成”)結束配置,Code::Blocks 就會創(chuàng)建你的第一個項目了。
打開 Sources 里的 main.c 這個 C語言的源代碼文件。點擊上面工具欄里有一個綠色的三角形按鈕,是用于運行程序,它會提示你是否要編譯,點擊 yes(當然了,你也可以點擊綠色三角形邊上的帶齒輪的綠色三角形按鈕,是用于“編譯再運行”),運行起來后我們的第一個控制臺程序輸出:
Hello world!
2. 控制臺程序還是窗口程序
現(xiàn)在,既然我們已經(jīng)把舞臺都搭好了,該是時候把我們的主角 C語言請出來了。我們將一起來寫第一個 C語言程序。
當然了, 這個程序會是黑白的,也不會跟你打招呼,更不會幫你泡咖啡。可能顯得毫無用處,但卻是你的第一個程序,我保證你會有成就感的。
我們在 Code::Blocks 這個 IDE 中看到,當你要創(chuàng)建一個項目時,IDE 會問你是創(chuàng)建 console(控制臺)程序還是 window(窗口)程序。
之前我們?yōu)榱丝焖傺菔荆x擇的是控制臺程序。
其實只有這兩種類型,沒有其他的了:
- 窗口程序
- 控制臺程序
先來介紹一下窗口程序,因為比較直觀,比較漂亮,顏值爆表。
這樣的程序你肯定見到過,下圖對大多數(shù)人來說很熟悉吧。
是的,上圖就是 Windows 系統(tǒng)的畫圖程序。它是一個窗口程序,就是有窗口的程序(有時候不止一個窗口)。我想你肯定想學習創(chuàng)建這樣的程序,但是如果你是第一次接觸編程,那有點難。
一開始還是最好從 console(控制臺)程序入門。
那么,所謂的控制臺程序長什么樣呢?
最初的程序都是控制臺程序,因為那個年代電腦還只能顯示黑白色,而且也沒有強大到可以運行窗口程序,不像今天的電腦。
當然了,時代在進步。Microsoft(微軟)公司的 Windows 系統(tǒng)使得電腦能被廣大群眾使用,就是因為它操作很簡單,幾乎所有操作都可以用窗口程序完成。
Windows 實在是太流行了,以至于大多數(shù)人都不知道 console(控制臺)程序長什么樣。不過,我有一個好消息:“控制臺程序并沒有死!”
實際上,Linux 操作系統(tǒng)給很多的人展示了控制臺程序的魅力,下圖就是 Linux 下的控制臺程序的截圖:
看上去還不錯,是嗎?好了,現(xiàn)在你已經(jīng)對控制臺程序有了初步概念了。
有一些注意點:
- 今天電腦已經(jīng)可以顯示彩色了,所以上面看到的控制臺也不是完全黑白的了。
- 對于初學編程的人來說,控制臺還是令人不太適應的。
- 如果我們掌握了這個工具,可以用它來做很多事情。
就如我們上面提到的,創(chuàng)建像上圖中的控制臺程序,其實很簡單,而且非常適合初學者。現(xiàn)在的控制臺程序不僅可以顯示彩色,而且如果你要給它設置一個背景圖片,也是可以辦到的。
說了這些,那是不是只有 Linux 才有控制臺程序,Windows 就沒有呢?
當然也有,在 Windows 中它被稱為 cmd,也就是 command(表示“命令”)的縮寫,也稱為“命令提示符”,是 Windows 環(huán)境下的虛擬 DOS 窗口。只不過它比較隱秘。可以用以下兩種把它請出來:
- 點擊“開始 -> 搜索 -> 輸入“cmd”,然后按回車鍵,或點擊“確定”。
- 用組合鍵 win+R 調(diào)出 (win 鍵就是鍵盤最下面從左邊數(shù)第二個鍵,上面有個 Windows 系統(tǒng)標志的),再輸入 cmd,然后按回車鍵,或點擊“確定”。
上圖就是 Windows 里面奇妙的控制臺。
當然了,蘋果的 macOS 操作系統(tǒng)中,我們也可以打開控制臺的,只要運行 Terminal 這個系統(tǒng)自帶的應用程序:
3. 最基礎的代碼
對于 C語言的每一個程序,我們都要輸入最基礎的幾行代碼。這幾行代碼不是太特別,但是必不可少。
我們現(xiàn)在就來看看“最基礎的代碼”長什么樣。
讓 IDE 為我們生成“最基礎的代碼”
之前我們已經(jīng)演示了,Code::Blocks 會為我們生成 C語言程序的最基礎代碼,如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}
其中
int main()
這一行也可以寫成
int main(int argc, char *argv[])
兩種寫法都是可以的,不過第二種(復雜一些的)更常用,也更專業(yè)。以后的課程我們會用 int main(int argc, char *argv[])
這種形式。
分析最基礎的代碼
對于第一次接觸編程的朋友,可能這個最基礎的代碼也是令人難以理解。
所以我們才要一起來學習如何閱讀代碼。
先從前兩行開始吧:
#include <stdio.h>
#include <stdlib.h>
這兩行很特別,我們會在源代碼開頭的地方見到這樣的以 # 號開頭的語句。像這樣特別的行,稱為預編譯指令。
這個術語聽起來有點復雜。預編譯指令會在編譯開始的時候,被一種叫做預編譯器的程序所讀取。
其實編譯器為我們做很多事情,我們之后的課程會詳細來說明。
但是這兩行到底是什么意思呢?
這里的 # 號是預編譯指令開始的標志,沒有什么特別的含義,后面接著的 include 表示“包含”,所以這兩句話的意思就是在我們的程序里包含 stdio.h 和 stdlib.h 這兩個文件,這兩個文件在系統(tǒng)的庫里已經(jīng)存在了,這些文件被稱為庫文件。
如果沒有這兩句話,那我們就不能在程序里調(diào)用這兩個文件定義的東西了。
接著,我們看到了下面的語句:
int main()
{
printf("Hello world!\n");
return 0;
}
以上我們所看到的語句塊,被稱為函數(shù)。其實 C語言的程序基本就是由函數(shù)來構成的。所以目前我們的程序只有一個函數(shù)。
我們現(xiàn)在還不會講很多函數(shù)的細節(jié),因為那將是后面的函數(shù)那一課的內(nèi)容,現(xiàn)在還早。但是我們會大體說一下函數(shù)的組成。
第一行包含了函數(shù)的名字,是第二個單詞 main。所以這里的函數(shù)稱為 main 函數(shù)。這是一個特殊的函數(shù),程序執(zhí)行總是從 main 函數(shù)開始。
一個函數(shù)有開始和結束,使用大括號 {} 來標識。所以我們的 main 函數(shù)包含以下兩行代碼
printf("Hello world!\n");
return 0;
這些在函數(shù)里的行也有名字,被稱為指令。每一條指令都會讓電腦做特定的事情。一個函數(shù)大體來說是用來集中一定數(shù)目的指令。比如我們可以創(chuàng)建一個函數(shù)叫做“打開文件”,這個函數(shù)會讓電腦為你打開某個文件。
函數(shù)的優(yōu)勢就是當你寫好了這個函數(shù)之后,你只需要使用(專業(yè)術語叫做調(diào)用)“打開文件”這個函數(shù),電腦就會為你執(zhí)行函數(shù)里面的指令。你不必每次在需要實現(xiàn)“打開文件”功能的地方都重復寫那些指令。函數(shù)可以大大節(jié)約代碼空間,提高效率。
printf("Hello world!\n");
這一行指令使得屏幕顯示 "Hello World!"(表示“你好,世界!”)這一句話。當你的程序執(zhí)行到這一行時,就在屏幕上顯示相應的信息。然后會執(zhí)行下一個指令。
printf 也是一個函數(shù),定義在 stdio 庫中,現(xiàn)在你知道
#include <stdio.h>
這句話的重要性了吧,如果沒有引入 stdio 這個庫,那我們的 main 函數(shù)就不能調(diào)用 printf 這個函數(shù)。
第二個指令 return 0;
大致就是表示函數(shù)結束了,并且返回 0 值。
那么,為什么我的函數(shù)返回 0,不是返回其他值呢?
實際上,每個 C語言程序結束時都會返回一個值,0 表示一切正常結束,其他的值表示異常。
這里我們只是簡單介紹了一下函數(shù)的概念。關于函數(shù)的細節(jié),請期待之后的課程。
測試你的程序
在 Code::Blocks 里面編譯(Build / Compile)并運行(Run) 你的最基礎代碼。得到如下結果
可以看到你的第一個程序在屏幕上顯示了 "Hello world!"。
下面的那幾行文字是 Code::Blocks 生成的,表示程序順利執(zhí)行,并且耗時 0.297 秒。
"Press any key to continue"這句話是讓你按鍵盤上的任意鍵來退出控制臺程序。
4. 特殊字符
特殊字符的作用是用來表示“換行”,“隔開一個制表符的空間”,等等。
特殊字符很好辨認,經(jīng)常是兩個字符的組合,第一個字符是反斜杠(\
),第二個字符是一個數(shù)字或者一個字母。
下面的兩個特殊字符是我們經(jīng)常會用到的:
-
\n
:換行符 (作用類似按回車鍵)。 -
\t
:制表符 (作用是空出幾個空格。空格的數(shù)目可以配置)。
5. 注釋,很有用
在結束這一課前,我們必須再來講一下注釋。不論什么編程語言,我們都可以在源代碼里添加注釋。C語言當然也不例外。
注釋,到底是什么啊?
簡單地說,注釋就是在你程序之中用來標注這個程序的作用,某一行代碼的作用,等等的文字。注釋真的很重要,因為即使是一個計算機天才,也要在某些地方做一些注解。注釋有如下作用:
在之后閱讀自己寫的代碼時不至于迷失方向。不可否認,在重新閱讀之前寫的代碼時,我們常常會忘記這個函數(shù)是干什么的,那個地方為什么要這樣寫。特別是代碼量很大,幾千幾萬行甚至更多時,如果沒有注釋,那閱讀起來會很費力。
如果你把你的代碼給別人閱讀,注釋往往可以節(jié)省對方理解你的代碼的時間。
要在 C語言的代碼中插入注釋,有幾種形式:
- 如果你的注釋比較短,在一行里就能寫完,那可以用
//...
這樣的形式。 - 如果你的注釋跨越好幾行,那可以用
/* ... */
的形式。
雖然程序行數(shù)變多了,但是注釋卻使我們的代碼變得易讀很多。編譯代碼的時候,編譯器會忽略所有的注釋,這些注釋不會出現(xiàn)在最終的程序里,只是為程序員服務的。
記住:
注釋要起到引導閱讀代碼的作用,以便理清頭緒。但是不要在很顯然就能懂的地方添加注釋。
引用 IBM 公司的一句格言:
“如果一個程序,在你僅僅看完它的注釋之后,你不能了解它的作用,那么把這個程序扔了吧。”
-- 大公司就是這么嚴格,這么任性。
6. 總結
- 程序可以通過一個控制臺(Console)或者窗口(Window)和用戶交互。
- 對初學者來說用控制臺來編寫第一個程序要簡單很多,雖然不太吸引人。
- C語言的程序主要是由分號結尾的語句構成的。
- 多條指令可以寫在一個函數(shù)里,就好像包裝在一個盒子里一樣。
- main 函數(shù)是程序的啟動函數(shù),程序運行時會執(zhí)行 main 函數(shù)里的指令。
- printf 函數(shù)使我們可以在控制臺的屏幕上顯示信息。
- printf 函數(shù)是定義在一個庫(Library)中的。庫中經(jīng)常包含不止一個函數(shù),可以給我們程序調(diào)用。
7. 第一部分第四課預告
今天的課就到這里,一起加油吧!
下一課:C語言探索之旅 | 第一部分第四課:變量的世界(一),內(nèi)存那檔事
下一課開始,我們一起探尋 C語言的變量的奇幻世界,還會聊到內(nèi)存哦,有些難度。
我是 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)運營者,慕課網(wǎng)精英講師 Oscar 老師,終生學習者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標桿直跑」