關鍵字:
其中一部分(還有一些在老師講的課件裡面)
register
宣告暫存器變數
const
宣告唯讀變數
volatile
說明變數在程式執行中可被隱含的改變
extern
宣告變數是在其他檔案中宣告(也可以看作是引用變數)
goto
無條件跳轉語句
register:
register變數必須是乙個單一的值,並且其長度應小於或等於整型的長度
該變數可能不在記憶體中,故不能用『&』來獲取register變數的位址
static:
1、修飾變數:
修飾全域性變數時:作用域僅在被定義的檔案中,
並且作用域是從定義之處開始,到檔案結尾處結束,即在定義處之前的**行也
不能使用,除非在前面再加extern***
為了避免這樣的麻煩,我們一般在檔案頭定義static全域性變數
修飾區域性變數時:延長變數的生命週期
2、修飾函式:
使函式變為靜態函式
和全域性變數修飾的作用一樣,限定了作用域
優點:不用擔心自己定義的函式與其他檔案中的函式同名
用來表示不能被其他檔案訪問的全域性變數和函式
變數型別:
型別
32位系統記憶體
short
2位元組int
4位元組long
4位元組char
1位元組float
4位元組double
8位元組定義規則:所有巨集定義、列舉常量,唯讀變數全用大寫字母命名,用下劃線分割單詞
一般定義時我們會對定義的量有一些習慣用名
型別習慣用名
名字來歷
intm,n,i,j,k
intchar
c,ch
char陣列a
array指標p
pointer
注意:乙個函式名禁止被用於其他地方
建議:結構體被定義的時候必須要有明確的結構體名
否則不利於**的維護和擴充套件
另外:所有的結構體(struct)和聯合體(union)的型別在轉換單元的結尾應該是完整的
使用規則:不同型別資料之間的運算要注意,精度擴充套件問題:一般低精度資料將向高精度資料擴充套件
禁止使用八進位制的常數和轉義字元:因為在計算機中,任何一』0『開頭的數字都會被認
為是八進位制數,所以我們寫固定長度數字的時候會有一定的風險
sizeof:
sizeof是關鍵字,而不是函式(雖然用法和函式類似!)
sizeof(int)*p的意思是?
表示計算int型所佔位元組數,然後再乘以p
if…else…:
bool btestflag = false;
(a)if(btestflag == 0); if(btestflag == 1); //寫法類似於變數,易誤會,不建議使用
(b)if(btestflag == true); if(btestflag == false); //false確定為0,但true的值卻不一定是1,所以不好
if(btestflag); if(!btestflag); //這種寫法不容易誤會,也沒有不確定的值,相對較好
float變數和「0」進行比較的if語句:
if ((ftestval >= -epsinon)&&(ftestval <= epsinon)); //epsinon是定義好的精度
如果這個語句為真,說明變數為0
規則:使用浮點型資料應該遵循已經定義好的浮點數標準
指標變數與「0」進行比較的if語句:
int *p = null;
if (p == 0); if(p != 0); //容易把指標看作整型變數,不好
if(p); if(!p); //容易把指標看作bool變數,不好
if(null == p); if(null != p); //比較好,可以防止少些』=『帶來的錯誤,因為「p == null」編譯可以成功,但結果錯
if語句規則:賦值運算子不能在產生布林值的表示式上
如果布林值需要賦值,那麼賦值操作必須在運算元之外分別進行,這樣可以避免「=」和「==」混淆
例:正確寫法:
x = y;
if (x != 0)
錯誤寫法:
if ((x = y) != 0)
if語句後面可以沒有else語句,但是if-else if語句必須由else子句結尾
switch().case語句:
if…else…語句一般表示兩個分支或巢狀,比較 少量的分支
switch().case則在分支很多的情況下使用,可以提高效率
switch().case
語句規則:每個
case
語句的結尾都要有
break
,否則將導致多個分支重疊(有意重疊不算)
最後必須用
default
語句,即使不需要
default
語句處理,也要保留以下語句:
default:
break;
switch().case
語句中禁止使用
return語句
case後面只能是整型或者字元常量或常量表示式
簡化每種情況對應的操作(**盡量精簡)
將default子句只用於檢查真正的預設情況
do.while ,for:
while迴圈: 先判斷,後執行
do.while 迴圈:先執行,後判斷
for迴圈: 可以很容易的控制迴圈次數
建議:在多重迴圈中,如果可能,將最長的迴圈放到最內層,以減少cpu跨切迴圈層的次數
不能在for迴圈體內修改迴圈變數,防止迴圈失控
迴圈盡可能短,要使**清晰,一目了然
迴圈巢狀盡可能控制在3層以內
for語句的控制表示式中不能包含任何浮點型的物件
return:
用於終止乙個函式並返回其後面跟著的值
規則:return
語句不能返回指向「棧」記憶體的「指標」(例如區域性變數陣列名),因為
該內存在函式體結束時會被自動銷毀
const:
定義const唯讀變數,具有不可變性
注:const修飾的唯讀變數必須在定義時進行初始化
const和#define的區別
const
定義時不分配空間
使用:第一次分配空間,之後不再
只給唯讀變數的記憶體空間
#define
作為巨集常量
每使用一次分配一次
立即數修飾指標時:
const int *p; //p可變,指向的物件不可變
int const * p; //p可變,指向的物件不可變
int * const p; //p不可變,指向的物件可變
const int * const p; //p不可變,指向的物件不可變
修飾函式的引數:在不希望乙個引數值在函式內被意外使用的時候用const修飾這個引數
例: void fun(const int *p)
即*p在函式中不可變
當用const修飾函式的返回值的時候,則返回值不可變
例:const int fun( void );
extern const int i; //正確的宣告
extern const int j = 10 ; //錯誤,該引數為唯讀變數,不可改變
volatile:
和const一樣是一種型別修飾符
加上volatile後的不同
int i = 10;
volatile int i = 10
int j = i; 1
int j = i; 3
int k = i; 2
int k = i; 4
因為 i 沒有作為左值,預設不變,所以1中取出 i 值
後,2中賦值的時候不會再次取 i,而是直接賦上次
取的值每次使用時都會從記憶體中重新獲取i的值
extern:
置於變數或函式前,表明變數或函式的定義在別的檔案中,下面**用到這些變數或函式是外來的,
union:
在c++裡,union的成員預設屬性是public
union關鍵字的用法和struct類似,但意義不同
struct
struct為結構體中的每個資料分配記憶體空間
union
union聯合體只有乙個足夠放聯合體中最大的資料型別的空間,每使用乙個資料都會將之前的資料覆蓋
注:大小端的不同會對union產生影響
enum(列舉):
使用舉例:
enum color
colorval;
其中的值為:green = 1;
red = 2;
blue = 3;
green_red = 10;
green_blue = 11;
c語言深度解剖筆記1
2016.8.14 dage 複習內容 c語言深度解剖筆記1 有三大類 算術運算子 關係運算子與邏輯運算子,還有位運算子等,相同優先順序運算子,從左至右依次運算。注意字尾運算優先順序高於字首。因此 i 應解釋為 i 基本表示式 1級 最高 字尾表示式 2極 單目 一元運算 3級 強制型別表示式 4級...
C語言深度解剖
1.關鍵字 是編譯器能認識的特殊字串符號。c語言共有32個關鍵字,含sizeof,計算物件所佔記憶體空間的大小。2.定義 建立乙個物件並分配一塊記憶體。3.宣告 告訴編譯器,名字已經匹配到了一塊空間,別的地方不能用它來作為變數名或物件名。宣告沒有分配記憶體,可以出現多次宣告。4.區域性變數 也叫自動...
C語言深度解剖
c語言深度解剖 本書目錄結構如下 第一章 關鍵字 1.1 最寬恒大量的關鍵字auto 1.2 最快的關鍵字register 1.3 最不實名的關鍵字static 1.4 基本資料型別 1.5 最冤枉的關鍵字sizeof 1.6 if else組合 1.7 switch case組合 1.8 do w...