C語言中不易察覺的錯誤

2021-05-23 17:51:54 字數 1933 閱讀 7265

一,空語句

空語句「;」也是一條語句,該語句什麼都不執行。常見錯誤為緊跟在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 ...