## C語言各種變量類型應用
[TOC]
### static 定義全局變量
> 定義好的變量引用的時候都是可執行的
~~~C
int main(){
void fun();
for(int i=0;i<3;i++)
fun();
return 0;
}
void fun(){
int i=0;
static int static_i = 0; // 全局調用
printf("%d=", i);
printf("%d\n", static_i);
i++;
static_i++;
}
結果:i= 0、0、 0
static_i=0、1、2
~~~
~~~
int main(){
int num=2;
for(int i=0;i<3;i++){
printf("原始num=%d\n", num);
num++;
{
static int num=1; // 內部調用
printf("static的num=%d\n", num);
num++;
}
}
return 0;
}
結果:num=2、3、4
static num=1、2、3
~~~
### auto 定義局部變量
> 定義的局部變量不受外部變量的影響
~~~
int main() {
int num=2;
for(int i=0;i<3;i++){
printf("num變量為%d\n", num);
num++;
{
auto int num=1; // 局部變量局部使用
printf("auto變量num=%d\n", num);
num++;
}
}
return 0;
}
結果: num=2、3、4
auto num=1、1、1
~~~
### external外鏈屬性
> C語言3種鏈接屬性: 外部(external), 內部(internal),無設置(none)
> C語言中有3種鏈接屬性: 外部(external), 內部(internal),無設置(none)
> 外部(external): 使用extern關鍵字
> 內部(internal): 使用static關鍵字
~~~
int a,b,c; // external 屬性
void add(){
int a=3;
c=a+b;
}
int main() {
a=b=4;
add();
printf("c=%d\n", c);
return 0;
}
結果: c=7
~~~
### register變量(涉及內存CPU)
> 一般情況下,變量的值是存儲在內存中的,CPU 每次使用數據都要從內存中讀取。如果有一些變量使用非常頻繁,從內存中讀取就會消耗很多時間,例如 for 循環中的增量控制:
~~~
int i;
for(i=0; i<1000; i++){
// Some Code
}
~~~
> 執行這段代碼,CPU 為了獲得 i,會讀取 1000 次內存。
#### 解決思路:
> 為了解決這個問題,可以將使用頻繁的變量放在CPU的通用寄存器中,這樣使用該變量時就不必訪問內存,直接從寄存器中讀取,大大提高程序的運行效率。
#### 寄存器、緩存、內存
> 為了加深對 register 變量的理解,這里有必要講一下CPU寄存器。
> 按照與CPU的遠近來分,離CPU最近的是寄存器,然后是緩存,最后是內存。
> 寄存器是最貼近CPU的,而且CPU只在寄存器中進行存取。寄存的意思是暫時存放數據,不用每次都從內存中取,它是一個臨時的存放數據的空間。
> 而寄存器的數據又來源于內存,于是 CPU <-- 寄存器 <-- 內存,這就是它們之間的信息交換。
> 那么為什么還需要緩存呢?因為如果頻繁地操作內存中同一地址上的數據會影響速度,于是就在寄存器和內存之間設置一個緩存,把使用頻繁的數據暫時保存到緩存,如果寄存器需要讀取內存中同一地址上的數據,就不用大老遠地再去訪問內存,直接從緩存中讀取即可。
> 緩存的速度遠高于內存,價格也是如此。
> 注意:緩存的容量是有限的,寄存器只能從緩存中讀取到部分數據,對于使用不是很頻繁的數據,會繞過緩存,直接到內存中讀取。所以不是每次都能從緩存中得到數據,這就是緩存的命中率,能夠從緩存中讀取就命中,否則就沒命中。
> 關于緩存的命中率又是一門學問,哪些數據保留在緩存,哪些數據不保留,都有復雜的算法。
> > 注意:上面所說的CPU是指CPU核心,從市場上購買的CPU已是封裝好的套件,附帶了寄存器和緩存,插到主板上就可以用。
關于寄存器變量有以下事項需要注意:
* 1) 為寄存器變量分配寄存器是動態完成的,因此,只有局部變量和形式參數才能定義為寄存器變量。
* 2) 局部靜態變量不能定義為寄存器變量,因為一個變量只能聲明為一種存儲類別。
* 3) 寄存器的長度一般和機器的字長一致,所以,只有較短的類型如int、char、short等才適合定義為寄存器變量,諸如double等較大的類型,不推薦將其定義為寄存器類型。
* 4) CPU的寄存器數目有限,因此,即使定義了寄存器變量,編譯器可能并不真正為其分配寄存器,而是將其當做普通的auto變量來對待,為其分配棧內存。當然,有些優秀的編譯器,能自動識別使用頻繁的變量,如循環控制變量等,在有可用的寄存器時,即使沒有使用 register 關鍵字,也自動為其分配寄存器,無須由程序員來指定。
- C語言模塊
- 基礎入門
- 各種變量類型
- 條件編譯
- 100例
- day1
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day2
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day3
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day4
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day5
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day6
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- day7
- 1.c
- 2.c
- 3.c
- 4.c
- 5.c
- 6.c
- 7.c
- 8.c
- 9.c
- 10.c
- linux基礎知識
- 目錄
- 系統設置
- ftp管理
- ftp-auth
- 進程
- ssh登錄
- 權限屬性
- 用戶/用戶組
- 安裝命令
- 數據庫操作
- 虛擬機vmvare-tools安裝
- VI命令
- 上傳下載
- error
- 虛擬機mac