一,空語句
空語句「;」也是一條語句,該語句什麼都不執行。常見錯誤為緊跟在if或迴圈語句之後,如if(); for();等,如果後面沒有{},則預設空語句為if(或for)條件成立時執行的語句。你的在某些條件下才能執行的語句,忽略條件限制而執行。
二,=與==
c語言中=與==是不同的操作符號,=是用來賦值的,==是用來判斷的,如果二者顛倒,則會帶來意想不到的錯誤。
(1)用=來判斷,
如 if (x=2){}, if (x=0){}等,表示式x=2永遠返回真,x=0永遠返回假。
(2)用==來賦值
如 x==2; 語句執行完後,x仍為原來的值,該語句沒有達到實際效果。
同樣,&與&&,|與||等。
三,if else巢狀
else與最近的未匹配的if匹配,不能單純從縮排上來實現你想要的效果,忽略{}會帶來程式上的混亂。
例如:
本意想讓else與第二個if匹配,但編譯器卻讓else與第乙個if匹配。
再如:
編譯器會讓else與第二個if匹配。
為了確保這種情況不再發生,請在每個if/else後面加{},同樣for/while後面也要{},哪怕後面只有一條語句。
四,巨集定義
巨集定義是一種字元替換,在編譯時完成,關於它的使用錯誤,是很多的。
例如求絕對值的巨集定義,#define abs(x) ((x)>0?(x):-(x))
(1)巨集定義後面不能跟分號
(2)巨集定義的空格
如果abs與(x)之間存在空格,則編譯時出現錯誤。
(3)小括號的缺失
這種情況下,對於單個變數,不會出現錯誤,但對於乙個表示式,則求的結果不是我們想要的結果,如abs(a-b);
所以下面情況會帶來錯誤:
#define abs(x) (x>0?x:-x)
#define abs(x) x>0?x:-x
#define abs(x) ((x)>0?(x):(-x))
(4)二次求值的變數
對於abs(x),如果我們這樣呼叫abs(x++),得到的結果是x+1的絕對值,而不是|x|。因此,應該把該句修改為abs(x);x++;
(5)巨集定義不是資料型別
如果#define int32 int *
定義變數int32 a, b;
則變數a為指標變數,b為普通整形變數,而非指標變數。
(6)巨集定義的函式
例如兩個數的交換,#define swap(a,b,t) (t)=(a); (a)=(b); (b)=(t);
如果用在if下,則if要加{},因為swap會擴充套件出3條語句。
更好的寫法是:
五,記憶體申請和釋放
假如有結構體:
當我們malloc申請節點空間的時候,別忘了給name申請空間。
當我們free釋放節點空間的時候,別忘了釋放name指向的空間。
六,switch
switch中的語句是按順序向下執行的,如果到某case分支後,跳出switch,別忘了加break。
七,字母o與數字0
字母o與數字0在某些編輯器中很相似,注意不要寫錯,並且,字母o與數字0在鍵盤上的位置很靠近,注意不要打錯。
同樣的問題,還有字母l與數字1與|(或)。
八,字串長度大小的比較
下面的if判斷是錯誤的:
if (strlen(s1) - strlen(s2) >= 0)
因為strlen返回型別為size_t,無符號整數,兩個數相減永遠》=0,沒有達到你所期望的結果。
正確的比較:if (strlen(s1) >= strlen(s2))
c語言中的段錯誤
在linux環境下進行程式設計時常常遇到段錯誤。1.當更改常量的值時可引發段錯誤。例如定義字串常量 char s hello world!而試圖通過s來改變其中某個字母的值時 就會出現段錯誤!2.指標使用不當。例如,某一結構體型別的指標變數為空時,這是通過該指標訪問結構體中的變數時就會引起段錯誤。而...
C語言中常見錯誤
c語言的最大特點是 功能強 使用方便靈活。c編譯的程式對語法檢查並不象其它高階語言那麼嚴格,這就給程式設計人員留下 靈活的餘地 但還是由於這個靈活給程式的除錯帶來了許多不便,尤其對初學c語言的人來說,經常會出一些連自己都不知道錯在 的錯誤。看著有錯的程式,不知該如何改起,本人通過對c的學習,積累了一...
C語言中關於錯誤輸出的函式
1.errno 說明 errno是乙個全域性整形變數,定義在errno.c,宣告在errno.h 標頭檔案 include 功能 輸出出錯原因 示例 include include include include include int main close fd return 0 結果 fail ...