首頁  >  文章  >  後端開發  >  常見的C++中const常數用法分析講解

常見的C++中const常數用法分析講解

php是最好的语言
php是最好的语言原創
2018-07-27 13:46:491761瀏覽

先對C語言中的const和C 中的const進行講解,前者const修飾的變數不是真的常數,它只是告訴編譯器該變數不能出現在賦值符號的左邊。後者C 在C的基礎上對const進行了進化處理。

1、C語言中的const:

  • #const 修飾的變數是唯讀的,本質還是變數

  • const修飾的局部變數在堆疊上分配空間

  • const修飾的全域變數在唯讀儲存區分配空間

  • const只在編譯期間有用,在執行期間無效

  • const無法定義真正意義上的常數

const修飾的變數不是真的常數,它只是告訴編譯器該變數不能出現在賦值符號的左邊。 const 局部變數是在堆疊上分配空間,可以透過指標改變這個空間裡面的值。過了編譯期,const變數的常數特性,只讀特性就沒有了,只讀特性只在編譯期有效,運行期根本無效。 const修飾的全域變數在唯讀儲存區分配空間,因此如果用指標去修改了const修飾的全域變量,程式就會崩潰,因為修改了程式唯讀存儲區中內容,大部分程式都會發生崩潰。

2、C 中的const

C 在C的基礎上對const進行了演化處理,具體表現在:

  • const宣告時,在符號表中放入常數

  • #編譯過程中發現常數直接以符號表中的值替換(常數折疊)

  • 編譯過程中也可能為對應的常數分配儲存空間:

    • const 用在全域或使用了static關鍵字說明,存放在只讀資料區

      extern const int i = 10;
      static const int i = 10;
      
      // 或者修饰全局变量
      const int a =10;
      int main()
      {}
    • 局部變數中對const常數使用了&操作符,在堆疊區分配空間

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

符號表是編譯過程中產生的一種資料結構

#include <iostream>
#include <string>
using namespace std;

const int i = 10;          // 如果通过指针去改变i,就会出现段错误:尝试修改只读数据区数据
int main()
{
    const int a = 5;
    int *p = (int *)&a;    // &a, 给a标识符分配空间了,并用p指向了该空间,
                           // 可以通过*p访问这个地址,但是不能通过a来访问
    *p = 10;               // 不能通过指针去改变a的值
    cout << a << endl;
    cout << *p << endl;
    
    return 0;
}

3、 與巨集定義比較

#C中的const常數類似巨集定義

const int c = 5;
// 类似于
#define c 5

但是cosnt與巨集定義的差異在於:

  • const常數是有編譯器處理

  • 編譯器對cosnt常數進行類型檢查和作用域檢查

  • 巨集定義由預處理器處理,只是進行單純的文字替換

#include <stdio.h>

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
    printf("a = %d\n", a);
    // 在g函数中访问f函数中的宏定义,完全没有问题
    // 在预处理的时候就进行了宏替换,对编译器来说,就是printf("a = %d\n", 3);
    // 宏是没有作用域的概念
    
    // const 定义的常量,被编译器处理,是有作用域的,不能访问b
    printf("b = %d\n", b);
}

int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0};    
    /* C编译
    const修饰得到的只是具有只读特性的变量,数组的大小是由两个变量的大小决定的,
    两个变量相加的结果需要在运行的时候才能直到,因此编译器编译的时候不知道这个数组长度,直接报错
    */
    
    /* C++编译
    const是定义的真正意义上的常量,直接从符号表中取值,编译的时候就知道A和B的值,
    可以得到数组的长度,不会报错
    */
    int i = 0;
    
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    f();
    g();
    
    return 0;
}

#相關文章:

php中const與define的區別分析

相關影片:

PHP底層分析影片教學

以上是常見的C++中const常數用法分析講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn