語義分析
(程式設計師本意是希望表示某種事物,而實際表示的卻是另外一種事物)
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.緩衝輸出與記憶體...