一、位運算
符號運算規則
&(與)
兩個位都為1時,結果才為1(從真假方面看,只有當兩個位都為真時,結果才為真)
\(或)
兩個位都為0時,結果才為0 (從真假方面看,如果兩個運算物件中相應的乙個位為真或者兩個位都為真,那麼結果為真)
^(異或)
兩個位相同為0,相異為1(從真假方面看,如果兩個運算物件中相應的乙個位為真且不是兩個位同為1,那麼結果為真)
~(取反)
0變1,1變0
<< (左移)
各二進位全部左移若干位,高位丟棄,低位補0
>>(右移)
各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)
掌握了這六種操作否的用法,c語言的位操作就差不多了。這六種操作符的解釋如下:
1、 & 按位與: 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0。
例如: 1&1 = 1 1&0 = 0 0&1 = 0 0&0 = 0
2、| 按位或:兩個相應的二進位制位中只要有乙個為1,該位的結果值為1。
例如: 1|1 = 1 0|1 = 1 1|0 = 1 0|0 = 0
3、^ 按位異或: 若參加運算的兩個二進位制位值相同則為0,否則為1。
例如: 1^1 = 0 0^1 = 1 1^0 = 1 0^0 = 0
4、~ 取反: 對乙個二進位制數按位取反,即將0變1,將1變0。
例如: 1! = 0 0! = 1
5、<< 左移:用來將乙個數的各二進位制位全部左移n位,右補0。
例如: 00001100 << 2 = 00110000
6、>> 右移:將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數,高位補0。
例如: 00001100 >> 2 = 00000011
二、靜態變數(static)
static最主要有以下兩點用途:
1、讓乙個變數長期有效,而不管其是在什麼地方被申明。
例如:
int
fun1()
fun1不管在什麼地方被呼叫,當函式退出後,s_value最後的值將一直會被系統儲存,下次s_value再被用到時,也即當fun1()再次被呼叫時,s_value初始值將是最近被儲存過的值(請注意s_value初始化操作只會被執行一次,即上述s_value =0 這個語句)。
2、避免多個檔案使用了相同的變數名而導致衝突 。
在c語言中static的作用如下:
第一、在修飾變數的時候,static修飾的靜態區域性變數只執行一次,而且延長了區域性變數的生命週期,直到程式執行結束以後才釋放;
第二、static修飾全域性變數的時候,這個全域性變數只能在本檔案中訪問,不能在其它檔案中訪問,即便是extern外部宣告也不可以;
第三、static修飾乙個函式,則這個函式的只能在本檔案中呼叫,不能被其他檔案呼叫。static修飾的區域性變數存放在全域性資料區的靜態變數區。初始化的時候自動初始化為0。
static
int st_val;
//靜態全域性變數 -- 靜態儲存區
int ex_val;
//全域性變數 -- 靜態儲存區int main(void)
}
c語言的作用域不僅描述了識別符號的可訪問的區域,其實也規定了變數的儲存區域,在檔案作用域的變數st_val和ex_val被分配到靜態儲存區,其中static關鍵字主要限定變數能否被其它檔案訪問,而**塊作用域中的變數a, ptr和local_st_val則要根據型別的不同,分配到不同的區域,其中a是區域性變數,被分配到棧中,ptr作為指標,由malloc分配空間,因此定義在堆中,而local_st_val則被關鍵字限定,表示分配到靜態儲存區,這裡就涉及到重要知識點,static在檔案作用域和**塊作用域的意義是不同的:在檔案作用域用於限定函式和變數的外部鏈結性(能否被其它檔案訪問), 在**塊作用域則用於將變數分配到靜態儲存區。
靜態變數常用使用方式:
定義區域性變數:用static宣告後的區域性變數的值在函式呼叫結束後不消失而保持原值,其占用的是靜態儲存區,所以即其占用的儲存單元不釋放。典型應用是用static變數求階乘n!。
// 求階乘 n!
intfac
(int
)main()
printf
("輸出%d!= %f ",n,sum) ;
}
三、extern變數宣告
c 語言中 extern 可以置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。這裡面要注意,對於 extern 申明變數可以多次,但定義只有一次。
例如:
extern u16 usart_rx_sta;
這個語句是申明 usart_rx_sta 變數在其他檔案中已經定義了,在這裡要使用到。
四、關鍵字const
const
int a;
//整型常數
intconst a;
//整型常數
const
int*a;
//指向整型常數的指標(整型常數不能修改,指標可以)
int*
const a;
//指向整型數得常指標(指標指向的整型數可以修改,指標不能修改)
intconst
* a const
;//指向整型常數的常指標(指標指向的整型數不能修改,同時指標也不能修改)
前兩個的作用是一樣,a是乙個常整型數。第三個意味著a是乙個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思 a是乙個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後乙個意味著a是乙個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。
const關鍵字注意:
1、const關鍵字修飾的變數可以認為有唯讀屬性,但它絕不與常量劃等號。
例如:
const
int i=5;
int j=0;
... i=j;
//非法,導致編譯錯誤,因為只能被讀
j=i;
//合法
2、const關鍵字修飾的變數在宣告時必須進行初始化。
例如:
const
int i=5;
//合法
const
int j;
//非法,導致編譯錯誤
3、c標準中,const定義的常量是全域性的。 嵌入式c語言 學習筆記
最普通的指標 int a 呼叫形式 1 a a指向的物件的位址 2 a a指向的物件的值 3 a a自身的位址 常用來作為引數,呼叫陣列,加上乙個說明陣列的長度的,從而獲取不定大小的陣列 第二種 int a n 指標陣列,包含n個整型指標 對應地 int a n 陣列指標,指向大小為n的陣列 嵌入式...
嵌入式C語言學習筆記2
1.資料型別基本型別 整型 signed short int long long long 考慮整數長度?unsigned 字元型 char 有符號,無符號 實型 float double 列舉型 enum 1 bool布林型別 邏輯型別 true false 真和假 例一 int main els...
嵌入式C語言學習(二)
c語音基礎 1.函式 形參與實參 函式呼叫 區域性變數和全域性變數 extern 動態儲存變數和靜態儲存變數 static 內部函式 定義加static 和外部函式 定義和使用時加extern 2.預編譯處理 2.1巨集定義 define 識別符號 字串 巨集名用大寫 巨集定義不是語句,不加分號 巨...