本文是c程式設計中一些常見錯誤的總結,有些是顯而易見的,有些則是不容易發現
**
a = b; /*出現bug
c = d; /* c = d將不會執行
*/
**:
if(a = b) c; /*a恆等於b,只有當b!=0的時候才執行
*/
再看下面的**:
if(0< a
< 5) c; /*
布林表示式恒為真
*/
上面**中的bool表示式恒為真,由於0 < a的值為0或1,永遠都小於5成立,當然c中沒有bool表示式,這裡只是假設
**:
#define assign(a,b) a=(char)bassign(x,y>>8)
變成
x=(char)y>>8/*可能不是你的目的
*/
**:
//foo.h:
struct
foo ;
#define bool char#include
"foo.h"//
f2.c
#define bool int#include
"foo.h
"
f1與f2對結構體foo中的bool型別定義不一致,如果互動就會出現錯誤
可能你會寫下面的**:
intfoo (a)
/*bug,因為有時候沒有值返回
*/
看下面的位元包結構:
structeeh_type
;
取決於用哪個c編譯器,還有你的機器使用大小端,這段**實現為:
<10-bits><6-bits> 或 <6-bits><10-bits>
同時取決於c編譯器、機器體系結構、不可思議的優先設定,這些項可能對齊到最近的8, 16, 32, or 64 bits.
foo(pointer->member, pointer = &buffer[0]);
不同的編譯器針對函式引數有不同的求值順序,gcc是從左到右的求值順序,有的編譯器是從右往左
**:
if( ... )
foo();
else
bar();
當加上除錯輸出資訊:
if( ... )
foo();
else
printf(
"calling bar()
" ); /*
注意! else止於此
*/bar();
/*注意! bar永遠會被執行
*/
**:
char *f()intg()
哪怕乙個簡單的表示式,c沒有定義***的順序,結果取決於你的編譯器,i/i++可能等於0或1,看下面的**:
#include int foo(int n)int bar(int n)
int main(int argc, char *argv)
事實上這個bug不是那麼出名,但是一旦發生嚴重性不會輸給其他的bug,看下面的**:
voidfoo(a)
}
現代編譯器會發出錯誤的警告,看下面**:
void foo(inta)
}
編譯時環境產生成百上千的編譯資訊,我們對此知之甚少。有些危險的常用名,導致很難被發現:
#include #define buffsize 2048long foo[bufsiz]; //
注意拼寫: bufsiz != buffsize
編譯器不會報錯,因為bufsiz已經在stdio.h中定義
在c中,八進位制數以0開始,如果數字中沒有『8』或『9』出現,編譯器不會警告
int numbers = ; //12, 而不是 14
c中的有符號char可能出現各種錯誤,比如128是乙個負數,另外,任何使用低精度整數都必須十分的小心,c使得這些太容易被忽略了
char s = 127;unsigned
char u = 127;s
++;/*
結果是負數
*/if (s/*
true!*/}
if(s>127)
if(u<0)
**:
C程式設計常見問題總結
本文是c程式設計中一些常見錯誤的總結,有些是顯而易見的,有些則是不容易發現 a b 出現bug c d c d將不會執行 if a b c a恆等於b,只有當b 0的時候才執行 再看下面的 if 0 a 5 c 布林表示式恒為真 上面 中的bool表示式恒為真,由於0 a的值為0或1,永遠都小於5成...
c 常見問題總結
答 首先,extern是c c 語言中表明函式和全域性變數作用範圍的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字extern宣告。extern c 是連線申明 linkage declarat...
網路程式設計常見問題總結
o y k h m b1 o r 對於網路程式設計的更多詳細說明建議參考下面的書籍 unix網路程式設計 tcp ip 詳解 unix環境高階程式設計 f0 i h,r v q 非阻塞io和阻塞io l r i3 h8 b 在網路程式設計中對於乙個網路控制代碼會遇到阻塞io和非阻塞io的概念,這裡對...