第3課-進化後的const分析
阿新 • • 發佈:2018-12-12
一、C語言中的const
const
修飾的變數是只讀的,本質還是變數const
修飾的區域性變數在棧上分配空間const
修飾的全域性變數在只讀儲存區分配空間const
只在編譯器有用,在執行期無用
const
修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊
- C語言中的
const
使得變數具有只讀屬性 const
將具有全域性生命週期的變數儲存於只讀儲存區
const
不能定義真正意義上的常量!
注:C語言中真正意義上的常量只有列舉!
程式設計實驗:C/C++中的const
#include<stdio.h>
int main(){
const int c = 0;
int* p = (int*)&c;
printf("Begin...\n");
*p = 5;
printf("c = %d\n",c);
printf("End...\n");
return 0;
}
列印結果:
Begin...
c = 0
End...
注:如果使用C語言編譯器進行編譯,則c會變成5,它的值通過指標改變了
二、C++中的const
C++在C的基礎上對const
進行了進化處理
- 當碰見const宣告時在符號表中放入常量
- 編譯過程中若發現使用常量則直接以符號表中的值替換
- 編譯過程中若發現下述情況則給對應的常量分配儲存空間
- 對
const
常量使用了extern
- 對
const
常量使用了&
操作符
- 對
注意:C++編譯器雖然可能為const常量分配空間,但不會使用其儲存空間中的值
C語言中的
const
變數- C語言中的
const
變數是只讀變數,會分配儲存空間
- C語言中的
C++中的
const
常量- 可能分配儲存空間
- 當
const
常量為全域性,並且需要在其它檔案中使用 - 當使用
&
操作符對const
C++中的
const
常量類似於巨集定義const int c = 5; // define c 5
C++中的
const
常量與巨集定義不同const
常量是由編譯器處理- 編譯器對
const
常量進行型別檢查和作用域檢查 - 巨集定義由前處理器處理,單純地文字替換
程式設計實驗:const 與巨集
#include<iostream>
using namespace std;
void f(){
#define a 3 //此處為預處理,在編譯之前已經將所有a都進行了替換
const int b = 4;
}
void g(){
printf("a = %d\n",a); //此處a已經進行了替換
//printf("b = %d\n",b);
}
int main(){
const int A = 1;
const int B = 1;
int array[A + B] = {0};//此處若用C語言編譯器,則報錯。因為陣列大小定義使用變數
int i = 0;
for(i = 0;i < (A + B);++i)
printf("array[%d] = %d\n",i,array[i]);
f();
g();
return 0;
}
列印結果:
array[0] = 0
array[1] = 0
a = 3
三、總結
- 與C語言不同,C++中的
const
不是隻讀變數 - C++中的
const
是一個真正意義上的常量 - C++編譯器可能會為
const
常量分配空間(但不會使用,只是為了相容C) - C++完全相容C語言中的
const
常量的語法特性