鍍金池/ 教程/ C/ 練習(xí)5:一個C程序的結(jié)構(gòu)
練習(xí)9:數(shù)組和字符串
練習(xí)6:變量類型
練習(xí)3:格式化輸出
練習(xí)4:Valgrind 介紹
練習(xí)28:Makefile 進階
練習(xí)14:編寫并使用函數(shù)
練習(xí)21:高級數(shù)據(jù)類型和控制結(jié)構(gòu)
練習(xí)20:Zed的強大的調(diào)試宏
練習(xí)18:函數(shù)指針
練習(xí)0:準(zhǔn)備
練習(xí)15:指針,可怕的指針
練習(xí)27:創(chuàng)造性和防御性編程
練習(xí)22:棧、作用域和全局
練習(xí)10:字符串?dāng)?shù)組和循環(huán)
練習(xí)8:大小和數(shù)組
練習(xí)16:結(jié)構(gòu)體和指向它們的指針
練習(xí)7:更多變量和一些算術(shù)
練習(xí)23:認識達夫設(shè)備
練習(xí)12:If,Else If,Else
練習(xí)2:用Make來代替Python
練習(xí)1:啟用編譯器
練習(xí)11:While循環(huán)和布爾表達式
練習(xí)5:一個C程序的結(jié)構(gòu)
練習(xí)24:輸入輸出和文件
練習(xí)25:變參函數(shù)
練習(xí)13:Switch語句
練習(xí)19:一個簡單的對象系統(tǒng)
練習(xí)26:編寫第一個真正的程序
導(dǎo)言:C的笛卡爾之夢
練習(xí)17:堆和棧的內(nèi)存分配

練習(xí)5:一個C程序的結(jié)構(gòu)

你已經(jīng)知道了如何使用printf,也有了可以隨意使用的一些工具,現(xiàn)在讓我們逐行分析一個簡單的C程序,以便你了解它是如何組織的。在這個程序里你會編寫一些不是很熟悉的東西,我會輕松地把它們拆開。之后在后面的幾章我們將會處理這些概念。

#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;
}

手動輸入這段代碼并運行它,之后確保在Valgrind下不出現(xiàn)任何錯誤。你可能不會這樣做,但你得習(xí)慣它。

你會看到什么

這真是一段無聊的輸出,但是這個練習(xí)的目的是讓你分析代碼:

$ make ex5
cc -Wall -g    ex5.c   -o ex5
$ ./ex5
You are 100 miles away.
$

分解代碼

當(dāng)你輸出這段代碼時,可能你只弄清楚了這段代碼中的一小部分C語言特性。讓我們快速地逐行分解它,之后我們可以做一些練習(xí)來更好地了解每一部分:

  ex5.c:1

  這是一個include,它是將一個文件的內(nèi)容導(dǎo)入到這個文件的方式。C具有使用.h擴展名作為頭文件的慣例。頭文件中擁有一些函數(shù)的列表,這些都是你想在程序中使用的函數(shù)。

  ex5.c:3

  這是多行注釋,你可以在/**/之間放置任意多行。

  ex5.c:4

  這是一個你遇到的更復(fù)雜的 main 函數(shù)。操作系統(tǒng)加載完你的程序,之后會運行叫做main的函數(shù),這是C程序的工作方式。這個函數(shù)只需要返回int,并接受兩個參數(shù),一個是int作為命令行參數(shù)的數(shù)量,另一個是char*字符串的數(shù)組作為命令行參數(shù)。這是不是讓人難以理解?不用擔(dān)心,我們稍后會講解它。

  ex5.c:5

  任何函數(shù)都以{字符開始,它表示“程序塊”的開始。在Python中用一個:來表示。在其它語言中,可能需要用begin或者do來表示。

  ex5.c:6

  一個變量的聲明和同時的賦值。你可以使用語法type name = value;來創(chuàng)建變量。在C的語句中,除了邏輯語句,都以一個;(分號)來結(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ù)。我們會在之后說明。

  ex5.c:11

  一個main函數(shù)的返回語句,它會向OS提供退出值。你可能不熟悉Unix軟件的返回代碼,所以這個也放到后面去講。

  ex5.c:12

  最后,我們以一個閉合的}花括號來結(jié)束了main函數(shù)。它就是整個程序的結(jié)尾了。

在這次分解中有大量的信息,所以你應(yīng)該逐行來學(xué)習(xí),并且確保至少掌握了背后發(fā)生了什么。你不一定了解所有東西,但是在我們繼續(xù)之前,你可以猜猜它們的意思。

附加題

  • 對于每一行,寫出你不理解的符號,并且看看是否能猜出它們的意思。在紙上寫下你的猜測,你可以在以后檢查它,看看是否正確。
  • 回頭去看之前幾個練習(xí)的源代碼,并且像這樣分解代碼,來看看你是否了解它們。寫下你不了解和不能自己解釋的東西。