名花有主已
C語言中有一些預先定義的字串,他們本身被賦予了自身的功能,并且我們在定義變數的時候,不能去搶他們的名字來用,他們就是今天的主角:關鍵字
首先我們簡單的和這些關鍵字見見面(被高亮的關鍵字是今天要介紹的)
| auto | break | case | char | const | continue | default | do |
|---|---|---|---|---|---|---|---|
| double | else | enum | extern | float | while | goto | if |
| static | long | register | return | short | signed | sizeof | int |
| struct | switch | typedef | union | unsigned | void | volatile | for |
這其中有大家熟知的資料型別:int,char,float,double…
也有控制陳述句用到的:if,for,do…
還有一些就是今天主要介紹的關鍵字,
至于還有一些新增的關鍵字,以上表格未曾提到,大家如果想去了解,可自行查找,
個別術語介紹(可先跳過,后文如若遇到不懂,可回來了解)
自動變數:指的是區域作用域變數,具體來說即是在控制流進入變數作用域時系統自動為其分配存空間, 并在離開作用域時釋放空間的一類變數
存盤類:是C語言與C++語言的標準中,變數與函式的可訪問性(即作用域范圍)與生存期
暫存器:暫存器是CPU內部用來存放資料的一些小型存盤區域,用來暫時存放參與運算的資料和運算結果,
? 計算機中的資料可以存盤到:暫存器,高速快取器,記憶體,硬碟,網盤
? (以上存盤從左到右按照,記憶體越來越大,造假越來越低,傳輸速度越來越慢排序)
?
auto
auto:宣告自動變數,一般都省略
? 默認情況下,在代碼塊內宣告的變數都是自動變數,但亦可用自動變數的關鍵字auto明確標識存盤類
代碼如下:
int a=0;
//上下兩個變數其實相同,只不過上面省略了auto
auto int a=0;
register
register:宣告暫存器變數
? 這個關鍵字定義變數后,會請求編譯器盡可能的將變數存在CPU內部暫存器中,而不是通過記憶體尋 址訪問,以提高效率,(因為暫存器很小,如果定義了很多register變數,可能會超過CPU的寄存 器個數,超過容量,故變數不是一定會存入暫存器內)
signed和unsigned
signed:有符號的(一般定義常量默認為signed)-------可以存盤正數和負數
unsigned:無符號的-----不能存盤負數
signed int a=10; //一般默認為signed,故只要寫成:int a=10;
unsigned float=-75.3------>錯誤定義
float=-75.3------>正確定義
signed float=-75.3------->正確定義
typedef
typedef:型別重定義-------一般對于太過復雜的資料型別,可以重新定義一個簡單的或有辨識度的使用
? typedef <資料型別> <你取的型別名>
unsigned long int a=10; //資料型別過于復雜,可以使用typedef重新定義
typedef unsigned long int u_l_int;
u_l_int a=10; //與unsigned long int a=10等價
extern
extern:用在變數或者函式的宣告前,用來說此變數/函式是在別處定義的,要在此處參考
? 默認情況下全域變數只能在定義它的檔案中使用(從定義該全域變數開始到所在檔案的檔案尾), 但如果在另一個檔案中將這個變數宣告為外部變數,那么這個變數的作用域將被擴展到另外一個文 件中,
代碼如下:
先在源檔案中創建專案名為:main.c
#inlcude <stdio.h>
extern int a;
extern Add(int x,int y);
int main()
{
printf("%d\n",a);
printf("%d\n",Add(3,2));
}
再在源檔案中創建專案名為:test.c-------作為全域變數,函式定義的檔案
int a=10;//全域變數
int Add(int x,int y)//
{
return x+y;//函式定義
}
結果會輸出10,5
拓展:
變數的宣告有兩種情況
? 1. 一種是需要建立存盤空間的,例如:int a 在宣告的時候就已經建立了存盤空間,
? 2. 另一種是不需要建立存盤空間的,通過使用extern關鍵字宣告變數名而不定義它,
例如:extern int a 其中變數 a 可以在別的檔案中定義的,
? extern int i; //宣告,不是定義
? int i; //宣告,也是定義定義分配存盤空間,而宣告不會
如何區分宣告還是變數
- extern告訴編譯器變數在其他地方定義了
- 如果宣告有初始化式,就被當作定義,即使前面加了extern
- 函式的宣告和定義區別比較簡單,帶有{ }的就是定義,否則就是宣告
- 沒有extern關鍵字的都是變數的定義
static
static:宣告靜態變數
- 修飾區域變數 使其生命周期變長(本質上改變了變數的存盤型別)
- 修飾全域變數 改變了全域變數的作用域,讓靜態的全域變數只能在自己的源檔案內使用
全域變數在其他源檔案內部可以被使用,是因為全域變數具有外部鏈接屬性,但是被static修飾后,就變成了內部鏈接屬性,其他源檔案就不能鏈接到這個靜態的全域變數- 修飾函式 改變了函式的鏈接屬性,將函式的外部鏈接屬性變成了內部鏈接屬性,使得函式只能在自己所在的源檔案內部使用
解釋1,代碼如下:
#include <stdio.h>
void Add(int x)
{
static int a=2;
a++;
printf("%d ",x+a);
}
int main()
{
int i=0;
for(i=0;i<3;i++)
{
Add(1);
}
return 0;
}
結果是4 5 6,大家知道int a=2是一個自動變數,在他作用域結束后,空間就會釋放掉,a的值不能保存,
而加上static改變了他的生命周期,使他在整個專案結束前的一直存在,所以a的值會不斷迭代
解釋2,3,代碼如下:(參考extern的內容,大家可以自行對比)
先在源檔案中創建專案名為:main.c
##inlcude <stdio.h>
extern int a;
extern Add(int x,int y);
int main()
{
printf("%d\n",a);
printf("%d\n",Add(3,2));
}
再在源檔案中創建專案名為:test.c-------作為全域變數,函式定義的檔案
static int a=10;//全域變數
static int Add(int x,int y)
{
return x+y;//函式定義
}
產生結果如下:

最后注意:define和include不是關鍵字,是預處理指令
以上介紹了一些關鍵字,但是并沒有完全介紹清楚,還有疑問的大家可以自己查詢,至于剩下的一些關鍵字,我將會在以后章節為大家詳細介紹,
希望大家稀飯啦\(^ _ ^)/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/274104.html
標籤:其他
