C語言深度解剖(1)

2021-09-02 17:51:35 字數 4829 閱讀 8819

關鍵字:

其中一部分(還有一些在老師講的課件裡面)

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...