C陷阱與缺陷的學習筆記

2021-09-06 10:34:30 字數 1634 閱讀 2246

1

用單引號括起的字元實際代表乙個整數,整數值對應於該字元在編譯器中採用的字符集對應的序列值;

雙引號括起的字串,代表的是乙個指向無名陣列起始字元的指標,該陣列被雙引號之間的字元和『\0』初始化。

對於'yes'這種形式的表示,不同的編譯器採取的方式不同,但大都理解為"乙個整數值,由y e s 所代表的整數值按照特定編譯器實現定義的方式組合得到",vc採用用後乙個字元覆蓋前乙個字元,最後得到的是最後乙個字元的值

2詞法分析中的"貪心法則"----每乙個符號應該包含盡可能多的字元,

所以n-->0的含義是 n-- >0,而不是n- ->0;

3注意分號結束的標誌可能會引起錯誤,比如定義了

struct log若沒有分號 則struct會被編譯器認為是主函式返回型別

main(){}

使用case分支語句時若沒有用 break就要注發布來,防止被誤認為寫錯;

4c語言的陣列需要注意的兩點:

1----c語言只有一維陣列,而且陣列的大小在編譯期間就作為乙個常數而存在,但是陣列中的元素可以是任何物件,所以可以**出乙個多維陣列;

2----通過陣列可以獲得指向下標為0 的元素的指標,有關陣列的其他操作看上去是下標運算,其實是指標運算,因此可以根據指標的行為來確定下標的行為

如*(a+i)即為下標為i的元素的引用,這種寫法如此常用,因此被簡記為a[i];

陣列作為引數毫無意義,因此c將自動地將作為引數的陣列宣告轉換成相應的指標宣告

int strlen(int a)

int strlen(int *a)等價

main(int argc, char *argv)強調argv指向某陣列的起始元素的指標,陣列的元素為字元指標型別

main(int argc, char **argv)等價

我們需要記住的是,複製指標並不同時複製指標所指向的資料。

5為main函式提供返回值,預設的是int,一般情況下系統會根據返回值來判斷程式是否執行成功,0代表執行成功;

若函式僅被檔案內的其他函式呼叫就可以宣告為static,因為它對外部是不可見的

6庫函式setbuf(stdout,buf)

程式輸出有兩種形式,一種是即時輸出,會造成較高的系統負擔,另一種是先暫存起來,然後大塊寫入的方式,通過setbuf控制在實際 的寫之前控制產生資料的量

輸出庫的stdout----buf緩衝區---實際寫入到stdout

main()

問題是buf被清空是在main結束之後,實際在此之前buf已經被釋放;

解決方法1---在main外面宣告static char buf[bufsiz];

動態分配緩衝區,在程式中不主動去釋放分配的緩衝區,所以在main函式結束時並不會釋放緩衝區,

char  *malloc();

setbuf(stdout, malloc(bufsiz));

ansi c標準 ----c99最新的c語言標準

處理64位資料可以用c99標準的long long來表示

typedef和#define有什麼區別?

一般來說最好使用typedef,能夠正確處理指標型別,

#define的優點是可以使用#ifdef來處理標頭檔案的重複包含;

另外不能在定義typedef之前使用它;

函式呼叫只能出現在區域性非靜態變數中;

C陷阱與缺陷(學習筆記)

掌握細節並不難,難的是如何運用之妙!詞 單詞 符號 作為賦值運算,是因為操作頻繁,書寫簡單 a b與表示式a b的含義相同,而與a b的含義不同 y x p與y x p不同 第乙個 被理解為注釋符 理解 這也許就是編碼規範要求操作符兩側新增合理空格的原因之一吧 用雙引號引起的字串,代表的卻是乙個指向...

C陷阱與缺陷 筆記

這本書很薄,看目錄感覺講的也很基礎,估計能較快看完。算是開始閱讀前陣子買的那波書的熱身吧。學過編譯原理,我們應當了解,編譯器的工作基本過程。在詞法分析中,不同編譯器的不同設定,會帶來不同的問題。雖然很是細微,但是如果出錯,可能編譯器不提示,讓人抓狂.int a 0195 int b 0215 int...

C陷阱與缺陷 筆記

fortan formula translator 公式翻譯程式語言 fibonacci 斐波那契 為什麼n 的含義是n 0,而不是n 0?a b的含義是?賦值操作符為什麼是 而不是 ascii碼 貪心原則?10是否能表示成010?單引號括起來的乙個字元表示乙個整數,雙引號括起來的乙個字元代表乙個指...