本節接觸了,c語言中的三大蛋疼:符號優先順序 ++i順序點 貪心法(其實這裡面好多都是跟編譯器有關的,而且有好多問題都是可以通過良好的程式設計習慣避免的)
1.注釋問題:
注釋不能把關鍵字弄斷,如:in/*注釋*/t
注釋不是簡單的剔除,而是使用空格替換
編譯器認為雙引號括起來的內容都是字串,雙斜槓也不例外。如:char *p = "heh//jfeafe" //不起注釋作用
2.接續符:
接續符\ ,常用於巨集定義中
#define swap(a,b) \
反斜槓同時有接續符和轉義符兩個用途,當接續符使用的時候,可以直接在程式中出現。當轉義符使用的時候,必須是出現在字串中。
接續符,也用與接續乙個關鍵字,**如下, 注意:但是直接連線\兩邊不能有空格。
#include #include int main()
3.邏輯運算子:有乙個短路規則
4.最容易忘記規則的兩個運算子:
三目運算子:(a?b:c) 當a的值為真的時候 返回b的值,否則返回c的值
逗號表示式:a,b 表示式的值為b的值
5.位運算:
對於左移和右移<< >>問題:無符號的,和有符號左移,都是補0,對於有符號的在右移動的時候,正數補零,負數補什麼跟編譯器有關係。並且左移和右移的大小不能大於資料的長度,也不能小於0。
交換兩個數,有一種不借助中間變數的方法,就是異或,**如下:
#include #define swap1(a,b) \
#define swap2(a,b) \
#define swap3(a,b) \
int main()
6.i++,i--順序點:
只有 i++ i--才有順序點 就是什麼時候開始加,什麼時候開始減。真心對於順序點 是搞不懂啊~~~ (++i)+(++i)+(++i),在gcc中是5+5+6(dev c++),在vc中是6+6+6(vc++6.0) ,不同編譯器順序點不一樣。這個例子的順序點 在; 前。
a=((++i),(++i),(++i)) 它的順序點在每個逗號前面完成計算。我覺得特殊的順序點 是可以通過合理的順序布局來避免的。
7.貪心法:
每乙個符號應該盡可能多的包含字元
8.符號運算優先順序問題:
個人覺得優先順序不用記,好好的寫括號吧~~~
給乙個易錯優先順序表,如圖:
9.c語言中的型別轉換:
c語言中有兩種轉換型別,分別是:隱式轉換和顯示轉換(強制型別轉換)
隱式轉換的規則:
a.算術運算中,低型別轉換為高型別
b.賦值運算中,表示式的型別轉換為左邊變數的型別
c.函式呼叫時,實參轉換成形參的型別
d.函式返回值,return表示式轉換為返回值的型別
隱式轉換的例子,**如下:
#include int main()
else
printf("i+j=%d\n", i + j);
return 0;
}
注意:在使用c語言的時候,應該特別注意資料的型別是否相同,盡量避免隱式轉換帶來的不必要的麻煩~~~ C語言深度解剖讀書筆記 2 字元的技巧
本節接觸了,c語言中的三大蛋疼 符號優先順序 i順序點 貪心法 其實這裡面好多都是跟編譯器有關的,而且有好多問題都是可以通過良好的程式設計習慣避免的 1.注釋問題 注釋不能把關鍵字弄斷,如 in 注釋 t 注釋不是簡單的剔除,而是使用空格替換 編譯器認為雙引號括起來的內容都是字串,雙斜槓也不例外。如...
讀書筆記《c語言深度解剖》 4
10.struct關鍵字 這裡struct關鍵字講解得比較少,主要有3點 1 空結構體的大小為1 在gcc下我的輸出是0 2 柔性陣列 在c99中,允許結構最後乙個元素是乙個大小未確定的陣列,這個陣列叫做柔性陣列。但是柔性陣列前面必須至少有乙個其他成員。用sizeof返回結構體大小的時候,並不包含柔...
C語言深度解剖讀書筆記1
關鍵字 意義關鍵字 意義auto 宣告自動變數,預設時編譯器一般預設為auto register 宣告暫存器變數 int宣告整型變數 const 宣告唯讀變數 double 宣告雙精度變數 volatile 說明變數在程式執行中可被隱含地改變 long 宣告長整型變數 typedef 用以給資料型別...