首頁 > 軟體

C語言 auto和register關鍵字

2022-04-14 16:02:09

一、關鍵字分類

C語言一共多少個關鍵字呢?一般的書上,都是32個(包括本書),但是這個都是C90(C89)的標準。其實C99後又新增了5個關鍵字。不過,目前主流的編譯器,對C99支援的並不好,我們後面預設情況,使用C90,即,認為32個

二、補充內容

在正式開始講解關鍵字之前,我們需要了解下面這些基本概念

1、變數的分類

變數分為全域性變數和區域性變數

區域性變數:定義在程式碼塊中的變數叫做區域性變數。區域性變數具有臨時性。進入程式碼塊,自動形成區域性變數,退出程式碼塊自動 釋放。[網上很多說函數中的變數是區域性變數,不能說錯,但說法是不準確的]

全域性變數:在所有函數外定義的變數,叫做全域性變數。全域性變數具有全域性性。

注:程式碼塊 — 在函數中,用{}括起來的區域,就叫做程式碼塊,程式碼塊可以巢狀

2、變數的作用域與生命週期

作用域概念:指該變數可以被正常存取的程式碼區域

全域性變數的作用域:在整個程式執行期間都有效

區域性變數的作用域:只在區域性變數所在的程式碼塊內有效

生命週期概念:指的是該變數從定義開闢空間到釋放的時間範圍,所謂的釋放,指的是曾經開闢的空間”被釋放“。

全域性變數的生命週期:定義完成之後,程式執行的整個生命週期內,該變數一直都有效

區域性變數的生命週期:進入程式碼塊,形成區域性變數[開闢空間],退出程式碼塊,"釋放"區域性變數

#include<stdio.h>
int g_val = 10;   //g_val 在所有函數外部定義,是全域性變數
int main()
{
    int a = 20;    //a 在main函數內部定義,是區域性變數
    printf("%dn", g_val);
    printf("%dn", a);
    return 0;
}
#include<stdio.h>
int g_val = 100;
int main()
{
    int x = 10;
    if (x == 10)
    {
        int y = 20;
        pritnf("%d %d", x, y);   //可以
    }
    pritnf("%d %d", x, y);  //報錯,y只能在 if 程式碼塊內部被存取
}
#include <stdio.h>
int g_x = 100; //全域性變數
void show()
{
    printf("show: 全域性: %dn", g_x); //在任何程式碼塊中都可以被存取
}
int main()
{
    show();
    printf("main: 全域性: %dn", g_x); //在任何程式碼塊中都可以被存取,甚至被修改
    return 0;
}
#include<stdio.h>
int g_x = 100; //全域性變數
int main()
{
    int g_x = 10; //區域性變數,與全域性同名
        printf("g_x:%dn", g_x); //輸出的是區域性,也就是區域性和全部同名的時候,優先區域性。
 
    return 0;
}

總結:作用域是空間上的概念,表示該變數能夠被有效存取或使用的區域

生命週期是時間上的概念,表示該變數空間什麼時候被開闢,什麼時候被釋放

當區域性變數和全域性變數重複出現時,區域性變數優先(就近原則) 

三、最寬宏大量的關鍵字 -- auto

1、如何使用:一般在程式碼塊中定義的變數,即區域性變數,預設都是auto修飾的,不過一般省略,但不是所有的變數預設都是auto修飾的,auto一般只用來修飾區域性變數

2、用法:auto關鍵字比較古老,一般我們在定義變數的時候直接省略即可

3、總結:auto用來修飾區域性變數,表示該區域性變數的生命週期和作用域只在該程式碼塊內有效,可以省略,不能用來修飾全域性變數。

#include<stdio.h>
auto int b = 10;  //報錯,auto 不能用來修飾全域性變數
int main()
{
    auto int a = 30; // 等價於 int a = 30;
}

四、最快的關鍵字 -- register

1、儲存分級

在計算機內部,越靠近CPU的儲存單元的執行速度越快,但其相對單位制造成本也越高,越遠離CPU的儲存單元執行速度越慢,單位造價越低,為了以最小的成本,達到最大的CPU執行效率,出現了儲存分級的辦法。

2、暫存器

暫存器存在的原因:CPU主要是負責進行計算的硬體單元,但是為了方便運算,一般第一步需要先把資料從記憶體讀取到CPU內,那麼也就需要CPU具有一定的資料臨時儲存能力,但是CPU並不是當前要計算了,才把特定資料讀到CPU裡面,因為那樣太慢了。 所以現代CPU內,都整合了一組叫做暫存器的硬體,用來做臨時資料的儲存。

暫存器存在的本質: 在硬體層面上,提高計算機的運算效率。因為不需要再從記憶體裡讀取資料。

3、register修飾變數

register修飾變數的作用:儘量將所修飾變數,放入CPU寄存區中,從而達到提高效率的目的

register修飾變數提高效率的本質:將變數放入暫存器中,使CPU可以直接對該資料進行操作,而不需要從記憶體中對其進行讀取。

既然用register修飾的變數可以提高效率,那麼是不是所以的變數都最好用register修飾呢?答案當然不是的。因為暫存器的數量是有限的,大量使用register修飾反而會降低程式的執行效率。那麼什麼樣的變數應該被register修飾呢?

  • (1)區域性的(全域性會導致CPU暫存器被長時間佔用)
  • (2)不會被寫入的(對資料進行寫入需要將資料重新載入進記憶體,這樣也就失去了把資料放進暫存器當中的意義)
  • (3)需要被高頻讀取的(直接從暫存器中對該資料進行讀取,提高效率)

注意:

  • (1)被register修飾的變數,不能取地址(因為該變數已經被放在寄存區中,而地址是記憶體相關的概念)
  • (2)register只是一個建議性的關鍵字,建議計算機將該變數放入記憶體之中,不是強制性的,也就是說,雖然一個變數已經被register修飾了,但是該變數還是可能被繼續放在記憶體當中
  • (3)如果要使用register,請不要大量使用,因為暫存器數量有限
#include <stdio.h>
int main()
{
    register int a = 0;
    printf("&a = %pn", &a);
    //編譯器報錯:錯誤 1 error C2103: 暫存器變數上的「&」
    //注意,這裡不是所有的編譯器都報錯,目前我們的vs2022是報錯的。
    return 0;
}

到此這篇關於C語言 auto和register關鍵字的文章就介紹到這了,更多相關C語言auto、register內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com