首頁 > 軟體

C語言與C++中const的用法對比

2022-04-21 19:01:08

一、C語言中的const

  • const修飾的變數是唯讀的,本質還是變數
  • const 修飾的區域性變數在棧上分配空間
  • const修飾的全域性變數在唯讀儲存區分配空間
  • const只在編譯期有用,在執行期無用
  • C語言中的const使得變數具有唯讀屬性
  • const將具有全域性生命週期的變數儲存於唯讀儲存區

const修飾的變數不是真的常數,它只是告訴編譯器該變數不能出現在賦值符號的左邊。

const 不能定義真正意義上的常數

C語言中真正意義上的常數只能通過列舉(#define也只是文字替換而已,不能定義常數)

#include <stdio.h>
int main()
{
    const int c = 0;
    int* p = (int*)&c;
    printf("Begin...n");
    *p = 5;
    printf("c = %dn", c);
    printf("End...n");
    return 0;
}

下圖為該程式分別在C語言和C++編譯環境在的執行結果:

接下來嘗試一下列印在C和C++環境下*p的值,增加一行程式碼,整體程式碼如下:

#include <stdio.h>
int main()
{
    const int c = 0;
    int* p = (int*)&c;
    printf("Begin...n");
    *p = 5;
    printf("c = %dn", c);
    printf("*p = %dn", *p);
    printf("End...n");
    return 0;
}

執行結果如下:

為什麼C語言和C++的編譯環境下輸出結果不同呢?第二節,來講一講C++中的const。

二、C++中的const

C++在C的基礎上對const進行了進化處理

  • 當碰見const宣告時在符號表中放入常數
  • 編譯過程中若發現使用常數則直接以符號表中的值替換
  • 編譯過程中若發現下述情況則給對應的常數分配儲存空間

對const常數使用了extern

對const常數使用&操作符

注意:C++編譯器雖然可能為const常數分配空間,但不會使用其儲存空間中的值。

關於符號表的介紹,如下圖所示:

三、進一步比較C和C++中的const

C語言中的const變數

  • C語言中const變數是唯讀變數,會分配儲存空間

C++中的const常數

可能分配儲存空間

  • 當const常數為全域性,並且需要在其它檔案中使用
  • 當使用&操作符對const常數取地址

C++中的const常數類似於宏定義

  • const int c = 5; ≈#define c 5

C++中的const常數與宏定義不同之處

  • const常數是由編譯器處理
  • 編譯器對const常數進行型別檢查和作用域檢查
  • 宏定義由前處理器處理,單純的文字替換

四、const與宏的區別

#include <stdio.h>
void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %dn", a);
    //printf("b = %dn", b);
}
int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0};
    int i = 0;
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %dn", i, array[i]);
    }
    f();
    g();
    return 0;
}

下面為該程式分別在C和C++編譯環境下的執行結果:

可以看到,該程式在C語言的編譯環境下報錯,這是因為在C語言中,const修飾的兩個變數是唯讀變數,array[A + B]中的A+B只有在執行時才知道,所以會報錯。而在C++的編譯環境下,A和B是真正意義上的常數,所以編譯器會到內部的符號表中取值,到array[A + B]時,編譯器知道了A=1,B=2,當然不會報錯了。

void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %dn", a);
    //printf("b = %dn", b);
}

在上面的程式中,C++的編譯環境下沒有報錯,這是因為宏是被前處理器處理的,直接進行文字替換,編譯器不知道宏的存在。

如果我們用下面的程式:

void f()
{
    #define a 3
    const int b = 4;
}
void g()
{
    printf("a = %dn", a);
    printf("b = %dn", b);
}

在C++的編譯環境下,就會報如下的錯誤。這是因為編譯器會對const常數進行一個型別檢查和作用域檢查,所以b只在f()內部有效,在f()外部無效。

宏和常數的不同:

  • 宏被前處理器處理,沒有型別和作用域的概念
  • 常數被編譯器處理,有型別和作用域的概念

五、小結

  • 與C語言不同,C++中的const不是唯讀變數
  • C++中的const是一個真正意義上的常數
  • C++編譯器可能會為const常數分配空間
  • C++完全相容C語言中const常數的語法特性

到此這篇關於C語言與C++中const的用法對比的文章就介紹到這了,更多相關C語言 const內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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