練習(xí)5:一個(gè)C程序的結(jié)構(gòu)
譯者:飛龍
你已經(jīng)知道了如何使用printf,也有了可以隨意使用的一些工具,現(xiàn)在讓我們逐行分析一個(gè)簡單的C程序,以便你了解它是如何組織的。在這個(gè)程序里你會(huì)編寫一些不是很熟悉的東西,我會(huì)輕松地把它們拆開。之后在后面的幾章我們將會(huì)處理這些概念。
#include <stdio.h>
/* This is a comment. */
int main(int argc, char *argv[])
{
int distance = 100;
// this is also a comment
printf("You are %d miles away.\n", distance);
return 0;
}
手動(dòng)輸入這段代碼并運(yùn)行它,之后確保在Valgrind下不出現(xiàn)任何錯(cuò)誤。你可能不會(huì)這樣做,但你得習(xí)慣它。
你會(huì)看到什么
這真是一段無聊的輸出,但是這個(gè)練習(xí)的目的是讓你分析代碼:
$ make ex5
cc -Wall -g ex5.c -o ex5
$ ./ex5
You are 100 miles away.
$
分解代碼
當(dāng)你輸出這段代碼時(shí),可能你只弄清楚了這段代碼中的一小部分C語言特性。讓我們快速地逐行分解它,之后我們可以做一些練習(xí)來更好地了解每一部分:
ex5.c:1
這是一個(gè)include,它是將一個(gè)文件的內(nèi)容導(dǎo)入到這個(gè)文件的方式。C具有使用.h擴(kuò)展名作為頭文件的慣例。頭文件中擁有一些函數(shù)的列表,這些都是你想在程序中使用的函數(shù)。
ex5.c:3
這是多行注釋,你可以在/*和*/之間放置任意多行。
ex5.c:4
這是一個(gè)你遇到的更復(fù)雜的 main 函數(shù)。操作系統(tǒng)加載完你的程序,之后會(huì)運(yùn)行叫做main的函數(shù),這是C程序的工作方式。這個(gè)函數(shù)只需要返回int,并接受兩個(gè)參數(shù),一個(gè)是int作為命令行參數(shù)的數(shù)量,另一個(gè)是char*字符串的數(shù)組作為命令行參數(shù)。這是不是讓人難以理解?不用擔(dān)心,我們稍后會(huì)講解它。
ex5.c:5
任何函數(shù)都以{字符開始,它表示“程序塊”的開始。在Python中用一個(gè):來表示。在其它語言中,可能需要用begin或者do來表示。
ex5.c:6
一個(gè)變量的聲明和同時(shí)的賦值。你可以使用語法type name = value;來創(chuàng)建變量。在C的語句中,除了邏輯語句,都以一個(gè);(分號)來結(jié)尾。
ex5.c:8
注釋的另一種形式,它就像Python或Ruby的注釋。它以//開頭,直到行末結(jié)束。
ex5.c:9
調(diào)用了我們的老朋友printf。就像許多語言中的函數(shù)調(diào)用,使用語法name(arg1, arg2);。函數(shù)可以不帶任何參數(shù),也可以擁有任何數(shù)量的參數(shù)。printf函數(shù)是一類特別的函數(shù),可以帶可變數(shù)量的參數(shù)。我們會(huì)在之后說明。
ex5.c:11
一個(gè)main函數(shù)的返回語句,它會(huì)向OS提供退出值。你可能不熟悉Unix軟件的返回代碼,所以這個(gè)也放到后面去講。
ex5.c:12
最后,我們以一個(gè)閉合的}花括號來結(jié)束了main函數(shù)。它就是整個(gè)程序的結(jié)尾了。
在這次分解中有大量的信息,所以你應(yīng)該逐行來學(xué)習(xí),并且確保至少掌握了背后發(fā)生了什么。你不一定了解所有東西,但是在我們繼續(xù)之前,你可以猜猜它們的意思。
附加題
- 對于每一行,寫出你不理解的符號,并且看看是否能猜出它們的意思。在紙上寫下你的猜測,你可以在以后檢查它,看看是否正確。
- 回頭去看之前幾個(gè)練習(xí)的源代碼,并且像這樣分解代碼,來看看你是否了解它們。寫下你不了解和不能自己解釋的東西。