linux學習筆記之——C語言關鍵字(一)

auto :聲明自動變量
short :聲明短整型變量或函數
int: 聲明整型變量或函數
long :聲明長整型變量或函數
float:聲明浮點型變量或函數
double :聲明雙精度變量或函數
char :聲明字符型變量或函數
struct:聲明結構體變量或函數
union:聲明共用數據類型
enum :聲明枚舉類型
typedef:用以給數據類型取別名
const :聲明只讀變量
unsigned:聲明無符號類型變量或函數
signed:聲明有符號類型變量或函數
extern:聲明變量是在其他文件中聲明
register:聲明寄存器變量
static :聲明靜態變量
volatile:說明變量在程序執行中可被隱含地改變
void :聲明函數無返回值或無參數,聲明無類型指針
if:條件語句
else :條件語句否定分支(與if 連用)
switch :用於開關語句
case:開關語句分支
for:一種循環語句
do 循環語句的循環體
while 循環語句的循環條件
goto:無條件跳轉語句
continue:結束當前循環,開始下一輪循環
break:跳出當前循環
default:開關語句中的“其他”分支
sizeof:計算數據類型長度
return :子程序返回語句(可以帶參數,也可不帶參數)循環條件
 
(以上摘自百度百科)
      是不是這破玩意兒看着就頭疼呢?那是肯定的嘛。。。。。。。c語言32個關鍵字,各有各的用法,有一些比較常用。像開頭那幾個定義類型的關鍵字,基本每個程序都會有一堆這種玩意兒,但是像goto這種東西就比較少用。這麼多的關鍵字。很多都已經用熟用爛了,也沒必要解釋太多,只是挑一些用法比較特殊,不太熟悉的來記錄一下。
 
 
一、auto與extern
1、auto,很少用到。
一般新手看見這個會以爲是一個很新奇的東西,回想這東西怎麼沒見過啊,從來也沒用過。甚至我在寫這篇之前還想了半天這個auto是幹嘛的。這個東西就是用來聲明局部變量的一個關鍵字。用百度百科裏面的話說就是“語言中包括了關鍵字auto,它可用於定義局部變量。但自從所有的非全局變量的缺省值假定爲auto以來,auto就幾乎很少使用了。”。這句貌似專業而且長的一比的話得意思就是“只要不是特別聲明瞭是全局變量,那麼它就是一個auto型的局部變量。”
說道這裏,或許該說一下局部與全局了。全局很明顯,就是你當前的整個C文件。若是一個包含有很多C文件的工程,那麼只要對它聲明extern就可以把他的作用域擴大到整個工程。那麼局部呢,顧名思義就是這整個工程或者是你當前的C文件中的某一部分。菊部,當然也是你身體的局部。
局部與全局,可以簡單的理解爲外面的能在裏面用,但裏面的不能再外面用。一般情況下,定義在哪個範圍內就屬於哪個作用域。當然也要注意它有沒有extern,若有extern就到處都可以用了。
 
那麼作用域是什麼?作用域就是兩個花括號圍起來的範圍。下面就有四對花括號,我分別標上了1、2、3、4。他們裏的作用域最小的是5.最大的是1。這個很明顯嘛~1包着2包着3包着4包着5。如果看不出來的話那麼再往下看。
1
{2
    {3
       {4
           {
           5
           }4
       }3
     }2
}1
 
這樣就看清了吧。
1{2{3{4{ 5 }4}3}2}1
如果
1
{2
     intb;
    {3
       {4
           {
           5
                 int a;
            }4
       }3
     }2
}1
這個加上了a和b。那麼a就是作用域5裏面的東西。外面都不能用,b是作用域2裏面的東西,外面不能用,但是裏面的345都可以用。
 
2、extern。這個用的一般般多啦。因爲沒有那麼多全局變量來聲明。
extern就是全局。如果還用上面哪個例子來說一下的話。那就是
 
1
{2
     intb;
    {3
       {4
           {
           5
                 extern inta;
            }4
       }3
     }2
}1
這個時候a就是麻雀變鳳凰了。這時候它的作用域擴展到了全局,也就是12345都可以用。不過一般沒有這樣在當前c文件裏面擴展作用域的。一般extern用來把變量或函數擴展到別的文件裏面去。
 
#include <stdio.h>
 
externint add(void)
{
int a= 1;
int b= 2;
int c= 0;
c =a +b;
return c;
}
(這裏面不給用tab鍵,格式湊活看吧。。等改天上圖好了。。)
 
這時候這個add函數就變成了一個全局函數。本工程下的別的文件就可以用這個函數了,但是前提是得把他們一起編譯。但若是別的文件中也有一個名爲add的函數,那麼這是系統就會報錯。
“multiple definitionof ‘add'"
多次定義add。
所以這一點一定要注意。
 
二、static與register
這兩種一種是靜態類型,一種是寄存器類型。
靜態類型很簡單,就是假如說你在一個局部變量裏定義了一個staticint a= 1;如果沒有這個static當程序運行完這個作用域之後就會將a的空間釋放,但是static卻不會,它會保留住a的空間,下次訪問的時候a的值不變。這裏千萬不要和全局變量弄混,出了這個作用域a是不能用的。
static一般用來還會再次訪問並且還需要這個值不變的情況下使用。
register是寄存器類型。將變量的空間放在cpu的寄存器裏。大家都知道,cpu的寄存器讀寫速度非常之快,但是數量很少。一般用來定義需要很快操作的變量。所以,慎用。
 
 
以上四種,被叫做存貯類型,就是當你聲明一個變量或者函數的時候以什麼方式存儲。當然你以什麼方式存儲計算機就會以什麼方式訪問啦~
 
 
三、volatile與const
const是聲明一個只讀變量,被聲明的變量不能修改。
volatile是告訴編譯器,你在編譯的時候不要對這個變量進行優化。
舉個例子
 
int a= 1;
int a= 2;
int a= 3;
 
當編譯器看到這三句的時候,他會非常聰明的把三句合併成最後一句,也就是inta =3;他夠聰明但是不夠智能。萬一我們這裏是要操作一個寄存器怎麼辦呢?而且這三句是必須要這麼寫的。那麼此時變成
 
volatile inta =1;
volatile int a= 2;
volatile int a= 3;
這樣編譯器就不會對其進行優化了。
一般要用到他的情況如下:
1). 並行設備的硬件寄存器(如:狀態寄存器)
2). 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
3). 多線程應用中被幾個任務共享的變量
(以上摘自百度百科,度娘確實是個好東西)
 
而且度娘還給了三個比較好的面試題:
1). 一個參數既可以是const還可以是volatile嗎?解釋爲什麼。
2). 一個指針可以是volatile 嗎?解釋爲什麼。
3). 下面的函數被用來計算某個整數的平方,它能實現預期設計目標嗎?如果不能,試回答存在什麼問題:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
 
下面是答案:
1). 是的。一個例子是隻讀的狀態寄存器。它是volatile因爲它可能被意想不到地改變。它是const因爲程序不應該試圖去修改它。
2). 是的。儘管這並不很常見。一個例子是當一箇中斷服務子程序修改一個指向一個buffer的指針時。
3). 這段代碼是個惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能在兩次取值語句之間發生改變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
 
四、sizeof活學活用。
sizeof的用處很廣,經常會用來獲取一個類型的大小,在申請空間,初始化空間的時候經常會用得到。
所以對sizeof活學活用是很重要的。
1、在申請空間的時候使用
如果我們要用malloc申請空間,而又不知道空間具體大小的時候,malloc是一個絕對不二的選擇。
 
struct linknod  *linknod1;//注意這個時候用結構體申請了一個指針,此時該指針有空間,但是指針卻未能指向某個空間。
 
*linknod1 = (struct linknod) malloc (sizeof(struct linknod));
因爲malloc的返回值是一個指針,我們申請空間之後將此地址賦值給linknod1.這樣我們就獲取了該空間。
 
2、在將某段空間中所有數據抹除(清零)之時
 
int i[10];//此時i中的十個元素都爲隨機數
 
memset(i, 0, sizeof(i));//從首地址開始(即是i),將後面sizeof(i)大小空間的數據清零。
 
3、特別注意,sizeof()是獲取空間的大小,而不是獲取其中數據的大小
int i【10】 = { 1, 2, 3}
 
這時候sizeof(i)= 4; 爲何?因爲i是一個數組名,也就是一個地址(數組名既是該數組的首地址),一個地址佔4個字節。所以此時sizeof(i)的值爲4。
 
 
 
 
至於別的條件控制語句沒有什麼特別的,經常用已經用的十分熟悉了。
 
 
 
 
(待續)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章