語法「陷阱」:語法是在詞法的基礎上延伸,它教怎樣組合成宣告,表示式,語句和程式
理解函式宣告
任何c變數宣告都是由: 型別 + 一組類似表示式的宣告符
float f;//乙個簡單的變數宣告
float f(); //這是乙個函式宣告,其返回值 float型別的函式
float *f; //這是乙個指向float型別的指標
float *f(); //這是乙個指標函式,其返回值是乙個指向float型別的指標
float (*f)(); //這是乙個函式指標 ,其返回值是乙個float 型別的值
函式指標和指標函式區別:
由於()的優先順序比 *的高, *f()執行時實際上是這樣的(*f()),指標函式的本質是乙個函式,
其返回值是float。
而如果用括號包住 *f 也就是這樣(*f)() 形式,就成為函式指標,其本質是乙個指標變數,只不過這
個變數是函式而已,由於括號把*f封裝,其返回值是float值,而不是乙個指標
#includevoid callback(int n)
int main()
運算子的優先順序問題
() 最高
算術運算子 其次
關係預算符 再次之
邏輯預算符 再再次之
以上是比較常用預算符,c語言有很多預算符,每個都記住不是那麼容易,再者記住作用也不大,
對於比價模糊的優先順序可以用()把表示式封裝起來
3.注意作為語句結束標誌的分號
在c如果不小心多打了分號,可能無傷大雅,也可能導致你的**不是你想要的樣子
//多打分號
int i=0;; //這樣編譯器會把他當成不會產生實際效果的空語句
if(a[i]>max); //注意這裡多了乙個分號 ,然後max=a[i]; 這條語句不管if條件是真是假都執行
max=a[i];
//少打分號
struct class
//注意這裡少打了個分號 這樣main函式返回值就變成了struct class 型別
main()
4.switch 語句
switch( num ) // num 是乙個整形常量
case 1:
printf(「1」);
break; //別忘記了,不然 可是要把 2 也一起列印出來的
case 2:
printf(「2」);
break;
5 . 函式呼叫:
#includevoid callback(int n) //宣告函式
int main(
)
6 . 懸掛 else 問題
if(x == 0)
if(y==0) error();
else
//c語言規定:else始終與同一括號內最近的未匹配的if結合
上面的**編譯器是如下結果:
if(x == 0)
if(y==0) error();
else
也就是說else 是和判斷表示式位y==0結合,而不是和x = =0;
所以時常給if加上花括號是種好習慣
if(x == 0)
else
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缺陷與陷阱 詞法陷阱
從較低的層面考察,程式是由符號 token 序列組成的,將程式分解成符號的過程,稱為詞法分析。這節主要分析在程式被詞法分析器分解成各個符號的過程中可能出現的問題。編譯器中負責將程式分解成乙個乙個符號的部分,一般稱之為詞法分析器。c語言中符號之間的空白 包括空格符,製表符和換行符 將被忽略。術語符號 ...
C陷阱與缺陷
c語言對於符號 包含乙個或多個字元 的識別規則 每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分 如果可能,繼續讀入下乙個字元,重...