第一章 c:創越時空的迷霧
1、根據編譯器設計思路發展的語言特性:
1)陣列下標從0開始,基於偏移量。
2)表示式中陣列名可看作是指標,作為函式引數,陣列隱式轉換為指標,不需要複製陣列內容。
2、c預編譯
1)字串替換:foo=bar
2)標頭檔案包含:.h
3)通用**模板擴充套件:巨集的實際引數只是原樣輸出,注意空格!最好只用於命名常量,注意大寫!
3、復合賦值符
如:b+=3;
對重複出現的運算元只寫一次
早期的b=+3;容易產生混淆
4、可移植的**
1)只使用已確定的特性
2)不突破編譯器的實現限制條件
3)不依賴編譯器定義的輸出
5、函式原型的目的
編譯時,對函式呼叫的實參和函式宣告中的形參進行一致性檢查。
最好不要省略形參名。
6、賦值操作的約束條件(滿足下列條件之一)
1)左右運算元都是指向有限定符或無限定符的相容型別的指標
2)左邊的指標指向的型別,必須具有右邊指標指向型別的全部限定符
例子:char * cp; //指向乙個char型別的指標
const char *cpp; //指向乙個具有const限定符的char型別的指標(不能修改其值)
cpp=cp;
這樣的賦值是正確的。
1)運算元指向的都是char型別,所以是相容的
2)左運算元具有右運算元所指向型別的全部限定符(本例子沒有),再加上自身的限定符const
如果反過來賦值就是錯的,因為cp指向物件的值是可以修改的,而cpp指向的物件的值是不可修改的。如果合法的話,那麼cpp意味著可以修改。
例子:const char**型別是「指向乙個有const限定符的char型別的指標的指標」
char**型別是「指向乙個char型別的指標的指標」
二者都是沒有限定符的指標型別,但是他們所指向的型別不一樣,前者指向char*,而後者指向const char*,所以不相容。
7、const
const限定符只是表示這個符號是唯讀的,不能被賦值,必須初始化。
可以用來限定函式的形參,這樣函式將不會修改實參指標所指的資料。
例子:const int *i=1;
int j=2;
i=&j; //i=2正確
不能使用指標修改這個整型值,比如*i=2,是錯誤的。但是可以改變指標本身的值,使它指向不同的位址
const與define的區別:
1)const只是給出了對應的記憶體位址,程式執行時只有乙份拷貝,而define有多份拷貝
8、型別轉換
資料型別朝著浮點精度更高、長度更長、無符號的方向轉換
例子:int a=;
define num (sizeof(a)/sizeof(a[0])) //採用a[0]的原因是不必改變define,如果型別有變化時
int d=-1;
if(d<=num-2)
if條件不會為真,因為sizeof返回型別是unsigned int,比較時d被提公升為unsigned int,-1變為乙個非常大的正整數。
可以強制型別轉換:if(d<=(int)num-2)
注意:1)盡量不要使用無符號型別,而應該使用int,這樣不會出現像-1被轉換成非常大的正數
2)只有在使用位段和二進位制掩碼時,使用無符號數。採用強制型別轉換的形式。
C專家程式設計
說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...
C 專家程式設計
2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...
c專家程式設計
pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...