C語言缺陷與陷阱語義分析

2021-08-28 19:20:18 字數 1965 閱讀 5684

語義分析

(程式設計師本意是希望表示某種事物,而實際表示的卻是另外一種事物)

1.     指標和陣列

陣列值必須注意的兩點:(1)c語言只有一維陣列,且陣列大小必須在編譯期作為乙個常數確定下來;(2)對乙個陣列只能進行:確定該陣列的大小,以及獲得指向該陣列下標為0的元素的指標。

只有在兩個指標指向同乙個陣列中的元素時,對兩個指標相加、減才有意義。

2.     非陣列的指標

對於字串常量,不但包括字串中所有字元,還包含乙個空字元(』\0』)的記憶體區域位址。

在進行常量字串的複製等操作時,要注意:(1)利用malloc申請分配的記憶體是否成功;(2)分配的記憶體使用之後應及時釋放;(3)分配記憶體的大小應為strlen(str)+1。

3.     作為引數的陣列宣告

使用陣列名作為引數,那麼陣列名會立刻被轉換為指向該陣列第乙個元素的指標。

如果指標引數為乙個陣列,則表示指向某一陣列的起始元素的指標。

4.     避免「舉隅法」(以含義更寬泛的詞語來代替含義相對較窄的詞語,或者相反。如以整體代表部分,或者以部分代表整體)

複製指標並不同時複製指標所指向的資料

5.     空指標並非空字串

當常數0被轉換為指標使用時,這個指標絕對不能被解除引用。即,當將0賦值給乙個指標變數時,絕對不能企圖使用該指標所指向的記憶體中儲存的內容。

6.     邊界計算與不對稱邊界

在c中,乙個陣列有n個元素,則其下標從0~n-1.為了避免陣列越界、「欄杆錯誤」等情況的發現,最好的處理方法是:用第乙個入界點和第乙個出界點來表示乙個數值範圍。

在處理迴圈時,運用--n>=0的效率比較高

7.     求值順序

在c中,只有&&、||、?:和,存在規定的求值順序。

&&和||先對左側運算元求值,只在需要時才對右側運算元求值;

在a?b:c,先對a求值,根據a 的值再求b或c的值;

,(逗號運算子),先對左側運算元求值,然後該值被「丟棄」,再對右側運算元求值。(注意:分隔函式引數的逗號並非逗號運算子)

8.     運算子&&、||和!

按位運算子&、|、~對運算元處理的方式是:將其視作乙個二進位制的位序列,分別對其每個位進行操作。(注意:負數的表示為其補碼);

邏輯運算子&&、||、!對運算元處理的方式是:將其視作要麼是「真」,要麼是「假」。

9.     整數溢位

無符號算術運算中,沒有所謂的溢位;

若算術運算子的乙個運算元是有符號整數,另乙個是無符號整數,那麼有符號整數會被自動轉換為無符號整數;

若算術運算子的兩個運算元都是有符號整數,溢位有可能發生,但溢位的結果是未定義的。

10.  為函式main提供返回值

在c中main函式返回型別預設為整型,通過main函式的返回值來告知作業系統該函式的執行是成功還是失敗。一般情況下,返回0代表程式執行成功,返回非0代表程式執行失敗。

c陷阱與缺陷 陷阱

例1 if x y break 這就話的意思就是把y賦值x,判斷x是否為0,實則是在判斷y是否為0 例2 while c c t c n 這句話的意思就是 c t c n 賦值給c,而有 符本身就是不為0的數,所以這就是while 1 的意思。例3 int x 4,p new int p 2 cou...

C陷阱與缺陷第三章 語義「陷阱」

1.指標陣列 注意 c語言中只有一維陣列,而且陣列的大小必須在編譯期就作為乙個常數確定下來。c語言中陣列的元素可以是任何型別的物件,也可以是另外乙個陣列,這樣,就可以 出乙個多維陣列。對於乙個陣列,只能夠做兩件事 確定陣列的大小,以及獲得指向該陣列下標為0的元素的指標。有關對陣列的操作,實際上都是通...

C語言陷阱與缺陷(5)

庫函式 1.返回整數的getchar函式 記住 getchar的返回型別為int 而不是char.2.更新順序檔案 乙個檔案輸入操作不能隨後緊跟乙個檔案輸出操作,反之亦然。若要同時進行檔案輸入 輸出操作,必須在其中插入 fseek函式的呼叫 用於改變檔案的狀態,使其能正常的讀取 3.緩衝輸出與記憶體...