C語言探索之旅 | 第一部分第三課:你的第一個程序

作者 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)。
轉(zhuǎn)載請注明出處。
原文:http://www.lxweimin.com/p/c73fecacd006

《C語言探索之旅》全系列

內(nèi)容簡介


  1. 前言
  2. 控制臺程序還是窗口程序
  3. 最基礎的代碼
  4. 特殊字符
  5. 注釋,很有用
  6. 總結
  7. 第一部分第四課預告

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ū)域:

  1. 工具欄:有很多按鈕,但只有幾個是我們時常用到的。
  2. 項目文件列表區(qū):左邊的欄里面顯示了你的項目的所有文件。
  3. 主界面:寫代碼的地方。
  4. 通知欄:會看到運行的錯誤,編譯的問題,等等。

那么,如何創(chuàng)建一個 C語言基本的控制臺應用程序呢?

首先到菜單里,依次點擊“File -> New -> Project”,

會打開類似如下的窗口:

創(chuàng)建新項目

可以看到,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)的畫圖程序

是的,上圖就是 Windows 系統(tǒng)的畫圖程序。它是一個窗口程序,就是有窗口的程序(有時候不止一個窗口)。我想你肯定想學習創(chuàng)建這樣的程序,但是如果你是第一次接觸編程,那有點難。

一開始還是最好從 console(控制臺)程序入門。

那么,所謂的控制臺程序長什么樣呢?

最初的程序都是控制臺程序,因為那個年代電腦還只能顯示黑白色,而且也沒有強大到可以運行窗口程序,不像今天的電腦。

當然了,時代在進步。Microsoft(微軟)公司的 Windows 系統(tǒng)使得電腦能被廣大群眾使用,就是因為它操作很簡單,幾乎所有操作都可以用窗口程序完成。

Windows 實在是太流行了,以至于大多數(shù)人都不知道 console(控制臺)程序長什么樣。不過,我有一個好消息:“控制臺程序并沒有死!”

實際上,Linux 操作系統(tǒng)給很多的人展示了控制臺程序的魅力,下圖就是 Linux 下的控制臺程序的截圖:

Linux 的 Terminal 終端

看上去還不錯,是嗎?好了,現(xiàn)在你已經(jīng)對控制臺程序有了初步概念了。

有一些注意點:

  1. 今天電腦已經(jīng)可以顯示彩色了,所以上面看到的控制臺也不是完全黑白的了。
  2. 對于初學編程的人來說,控制臺還是令人不太適應的。
  3. 如果我們掌握了這個工具,可以用它來做很多事情。

就如我們上面提到的,創(chuàng)建像上圖中的控制臺程序,其實很簡單,而且非常適合初學者。現(xiàn)在的控制臺程序不僅可以顯示彩色,而且如果你要給它設置一個背景圖片,也是可以辦到的。

說了這些,那是不是只有 Linux 才有控制臺程序,Windows 就沒有呢?

當然也有,在 Windows 中它被稱為 cmd,也就是 command(表示“命令”)的縮寫,也稱為“命令提示符”,是 Windows 環(huán)境下的虛擬 DOS 窗口。只不過它比較隱秘。可以用以下兩種把它請出來:

  1. 點擊“開始 -> 搜索 -> 輸入“cmd”,然后按回車鍵,或點擊“確定”。
  2. 用組合鍵 win+R 調(diào)出 (win 鍵就是鍵盤最下面從左邊數(shù)第二個鍵,上面有個 Windows 系統(tǒng)標志的),再輸入 cmd,然后按回車鍵,或點擊“確定”。
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. 總結


  1. 程序可以通過一個控制臺(Console)或者窗口(Window)和用戶交互。
  2. 對初學者來說用控制臺來編寫第一個程序要簡單很多,雖然不太吸引人。
  3. C語言的程序主要是由分號結尾的語句構成的。
  4. 多條指令可以寫在一個函數(shù)里,就好像包裝在一個盒子里一樣。
  5. main 函數(shù)是程序的啟動函數(shù),程序運行時會執(zhí)行 main 函數(shù)里的指令。
  6. printf 函數(shù)使我們可以在控制臺的屏幕上顯示信息。
  7. printf 函數(shù)是定義在一個庫(Library)中的。庫中經(jīng)常包含不止一個函數(shù),可以給我們程序調(diào)用。

7. 第一部分第四課預告


今天的課就到這里,一起加油吧!

下一課:C語言探索之旅 | 第一部分第四課:變量的世界(一),內(nèi)存那檔事

下一課開始,我們一起探尋 C語言的變量的奇幻世界,還會聊到內(nèi)存哦,有些難度。


我是 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)運營者,慕課網(wǎng)精英講師 Oscar 老師,終生學習者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標桿直跑」

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內(nèi)容