C的陷阱與缺陷小記

2021-06-28 12:45:06 字數 2949 閱讀 9727

tip1: 

「=」表示的是賦值符號它是乙個操作符而「==」是比較符號。

比較符號這樣書寫if(flag == x){}就不會導致「==」誤寫成「=」依然通過編譯。

tip2:

c語言中「&&」表示取並的邏輯運算,而「&」表示按位求與操作。

「||」表示取或的邏輯運算,而「|」表示按位求或操作。

tip3:

c語言中編譯器總是用貪心演算法讀入符號,即c語言總是不斷的讀入字元組成c語言的語法符號,直到它不能成為乙個符號為止。

例如:b---a == (b--)- a;

tip4:

c語言總是把以0開頭的數字符作為8進製數。例如:123 == 0x85而        0123 == 0x53;    二者大小大相徑庭。

tip5:

單引號括起來的是乙個代表字元的整數,而雙引號括起來的代表的是乙個字串首位址的指標,二者有著本質的區別。

int  x = 'c';正確

int x = "c";                    錯誤

char *px = "c";                 正確

char *px = 『c』;               錯誤

tip6:

在緊接著if、for等條件語句後要緊跟著語句時不能多乙個分號。 例:

if(x > b);

x = b;這就是無論x是否大於b。x = b;都會被執行。

也不能在一些語句後遺漏一些分號 例:

if(x > b)

return

b--;

a--;這樣返回的就是return b--;了。

tip7:

如果定義了函式fun();呼叫時也要fun();即使其沒有引數,如果fun;只是計算了它的函式位址。

tip8:

c語言中else始終與同一括號的內最近的未匹配的if相結合。注意要保持縮排這才是良好的程式設計風格。 例:

tip9:

關於陣列的兩點注意:

a:c語言中沒有多維陣列的概念。二維陣列無非是乙個以一維陣列為元素的一維陣列罷了。

陣列的大小必需在編譯期就被乙個常數所確定。

b:對於陣列我們能確定的就是其大小以及該陣列下標為0的元素的位址而陣列名這個變數儲存的就是這個位址。

也就是乙個常指標。

tip10:

定義陣列a[10];只有在sizeof(a);時它代表的是整個陣列。其他時候代表的都是陣列下標為0的元素的首位址。

tip11:

要始終記著:c語言中沒有所謂的二維陣列、三維陣列,只有一維陣列。

例:定義陣列iaanode[4][6];

代表的是iaanode[0]的位址。

也就是指向iaanode[0]的指標同理它是乙個(ing)[6]型指標,那麼iaanode[3]表示的是乙個陣列名。

於是我們有

int *p = iaanode[3];

int *p = *iaanode;

int (*p)[6] = iaanode;

*(*(iaanode + 3)+5) == *(iaanode[3]+5) == iaanode[3][5];表示的是最後一行最後乙個int元素。

tip12:

字串代表的是記憶體中一塊包含字串本身及「\0」結束符的記憶體首位址。strlen返回的是字串的字元個數不包括「\0」;

tip13:

c標準允許取陣列中實際不存在的「溢界」元素的位址用來賦值與比較。

tip14:

c語言規定了四個運算子的求值順序:

a:a||b       先對a求值,如果a為假則對b求值。如果a為真,則不再對b求值、

b:a&&b      先對a求值,如果a為假則對不對b求值。如果a為真,則再對b求值。

c:(a)? (b) : (c);

先對a求值,如果a為真,再對b求值c不再求值。反之,再對c求值不再對b求值。

d:a , b;     先對a求值,丟棄a的值。再對b求值,將b的值作為整個表示式的值。

但是要特別注意的是函式中形參列表中的逗號並非逗號表示式。

tip15:

c語言中的函式的返回值如果顯示的宣告則預設為int型。

tip16:

每乙個外部變數(全域性變數)可以宣告多次但只能定義一次。當用乙個static修飾乙個外部變數或函式時,則這個物件只在當前檔案中可見,其他檔案不可見。

tip17:

乙個未宣告的識別符號,後跟乙個括號。則它視為乙個返回為整型的函式。

tip18:

sizeof()返回的是乙個物件的記憶體占用的位元組數。是乙個無符號的數。

tip19:

關於巨集:

巨集定義的符號是#define後第一次出現空格的之前的所有字元組成的字串,但這只在巨集定義時起作用。 例:

#define   f(x)                         (x++)    預編譯器在編譯時是用f(x)代替(x++)

#define   f   (x)                      (x++)    預編譯器在編譯時是用f代替    (x)(x++)

但是如果程式執行時有(x++)      則用f     (x)  代替。

tip20:

巨集與typedef的區別

例:#define         ptype1                       char *

#define         char *                       ptype2

定義兩個變數:

ptype1     pa1,            pb1;

ptype2     pa2,             pb2;

pa1表示指向char型的指標。

pb1表示char型變數。

pa2與pb2均表示乙個指向char型的指標。ptype2 是乙個與char *有相同功效的資料型別。

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陷阱與缺陷

c語言對於符號 包含乙個或多個字元 的識別規則 每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分 如果可能,繼續讀入下乙個字元,重...

C陷阱與缺陷

1.int num 10 測試一下 num 0 是否 等於 0 num 因為num是首位址 num 0 0 num 2.其實c中只有一維陣列 我們所說的 int a 3 4 只是乙個包含了三個元素 每個元素都是包含了四個整形值的一維陣列 3.int num 10 10 int p num 0 名為n...