1.1 入門
一個C語言程序,無論大小如何,都是由函數和變量組成的。函數中包含一些語句,以指定所要執行的計算操作;變量則用於存儲計算過程中使用的值。
函數之間進行數據交換的一種方法是調用函數向被調用函數提供一個值(稱爲參數)列表。
1.2 變量與算術表達式
輸出格式說明表
%d |
按照十進制整型數打印 |
%6d |
按照十進制整型數打印,至少6個字符寬 |
%f |
按照浮點數打印 |
%6f |
按照浮點數打印,至少6個字符寬 |
%.2f |
按照浮點數打印,小數點後有兩位小數 |
%6.2f |
按照浮點數打印,至少6個字符寬,小數點後有兩位小數 |
%o |
按照八進制整型數打印 |
%x |
按照十六進制整型數打印 |
%c |
按照字符格式打印 |
%s |
按照字符串格式打印 |
%% |
表示百分號(%)本身 |
%u |
無符號常量 |
1.3 for語句
for語句是對while語句的推廣。在實際編程過程中,可以選擇while和for中任意一種循環語句,主要看使用哪一種更清晰。for語句比較適合初始化和增加步長都是單條語句並且邏輯相關的情形,因爲它將循環控制語句放在一起,且比while語句更加緊湊。
1.4 符號常量
#define指令可以把符號名(符號常量)定義爲一個特定的字符串,格式如下:
#define 名字 替換文本
替換文本可以是任何字符序列,而不僅限於數字。
注意:#define指令行末尾沒有分號。
1.5 字符輸入/輸出
標準庫的輸入/輸出都是按照字符流的方式處理。文本流是由多行字符構成的字符序列,而每行字符則由0個或多個字符組成,行末是一個換行符。
標準庫提供了一次讀/寫一個字符的函數,其中最簡單的是getchar和putchar函數。每次調用getchar時,從文本流中讀入下一個輸入字符,並將其作爲結果值返回;每次調用putchar時,將打印一個字符。
注意,單引號中的字符表示一個整型值,該值等於此字符在機器字符集中對應的數值,我們稱之爲字符常量。但是,它只不過是小的整型數的另一種寫法而已,比如,’A’是一個字符常量,在ASCII字符集中其值爲65。
1.6 數組
數組下標可以是任何整型表達式,包括整型變量以及整型常量。
程序中經常使用下列方式表示多路判定:
if(條件1)
語句1
else if(條件2)
語句2
...
...
else
語句n
這種方式中,各條件從前往後依次求值,直到滿足某個條件,然後執行對應的語句部分。第三章中將討論的switch語句提供了編寫多路分支程序的另一種方式,它特別適合於判定某個整型或字符表達式是否與一個常量集合中的某個元素相匹配的情況。
1.7 函數
函數定義的一般形式爲:
返回值類型 函數名(0個或多個參數聲明)
{
聲明部分
語句序列
}
我們通常把函數定義中圓括號內列表中出現的變量稱爲形式參數,而把函數調用中與形式參數對應的值稱爲實際參數。
函數的返回值可通過return語句實現:return 表達式;
函數不一定都有返回值。不帶表達式的return語句將把控制權返回給調用者,但不返回有用的值。main函數也可以向其調用者(程序的執行環境)返回一個值,一般來說,返回值爲0表示正常終止,非0表示出現異常情況或出錯結束條件。
1.8 參數——傳值調用
在C語言中,所有函數參數都是“通過值”傳遞的。也就是說,傳遞給被調用函數的參數值存放在臨時變量中,而不是存放在原來的變量中。即,被調用函數不能直接修改主調函數中變量的值,而只能修改其私有的臨時副本的值。必要時,也可以讓函數能夠修改主調函數中的變量,這種情況下,調用者需要向被調用函數提供待設置值的變量的地址(指向變量的指針),而被調用函數則需要將對應的參數聲明爲指針類型,並通過它間接訪問變量。
如果是數組參數,傳遞給函數的值是數組起始元素的位置或地址——它並不複製數組元素本身。在被調用函數中,可以通過數組下表訪問或修改數組元素的值。
1.9 字符數組
在C語言中,若出現類似於”hello/0”的字符串常量時,它將以字符數組的形式存儲,數組的各元素分別存儲字符串的各個字符,並把字符’/0’(即空字符,其值爲0)插入到數組的末尾,以標記字符串的結束。
1.10 外部變量與作用域
函數中每個局部變量只在函數被調用時存在,在函數執行完畢退出時消失。這也是其他語言把這類變量稱爲自動變量的原因。以後我們使用“自動變量”代表“局部變量”。(第4章將討論static存儲類,這種類型的局部變量在多次函數調用之間保持值不變。)
由於自動變量只在函數調用執行期間存在,因此,在函數的兩次調用之間,自動變量不保留前次調用的賦值,且在每次進入函數時都要顯式爲其賦值。如果自動變量沒有賦值,則其中存放的是無效值。
還可以定義位於所有函數外部的變量,即在所有函數中都可以通過變量名訪問這種類型的變量。由於外部變量可以在全局範圍內訪問,因此,函數間可以通過外部變量交換數據,而不必使用參數表。再者,外部變量在程序執行期間一直存在,而不是在函數調用時產生、在函數執行完畢時小時。即使在對外部變量賦值的函數返回後,這些變量仍將保持原來的值不變。
外部變量必須定義在所有函數之外,且只能定義一次,定義後編譯程序將爲它分配存儲單元。在每個需要訪問外部變量的函數中,必須聲明相應的外部變量,此時說明其類型。聲明時,可以用extern語句顯式聲明,也可以根據上下文隱式聲明。
在源文件中,如果外部變量的定義出現在使用它的函數之前,那麼在那個函數中就沒有必要使用extern聲明。如果程序包含在多個源文件中,而某個變量在file1中定義,在file2和file3中使用,那麼在file2和file3中就需要使用extern聲明來建立該變量與其定義之間的聯繫。人們通常把變量和函數的extern聲明放在一個單獨的文件中(頭文件),並在每個源文件的開頭使用#include語句把所要用的頭文件包含進來。
定義(define)與聲明(declaration):“定義”表示創建變量或分配存儲單元,而“聲明”指的是說明變量的性質,但並不分配存儲單元。
關於外部變量的深刻理解見附錄1。(本分類的文章附錄1 http://blog.csdn.net/jinjingwen/archive/2011/02/21/6197903.aspx)