const怎么理解?
const修飾的變數不能夠在作為左值!!初始化完成后,值不能被修改!!
C 和C++中const 的區別?
在C程式中
test.c
const int a; 只定義,不做初始化(C中允許),如果不做初始化,那么后面就不能再賦值了.
在C語言中const修飾的量,可以不用初始化,這個不叫常量,叫做常變數,本質還是變數,只是
不能作為左值被修改值了
例如1: 在.c的程式中
const int a=100;
int array[a]={}; 是不可以的, 因為a不是常量,他還是個變數
例如2: 在.c的程式中
const int a=100;
int *p=(int )&a;
p=300;
printf("%d %d %d \n",a,p,(&a));//結果都為300
a只是在語法上保證了不能作為左值被修改,但是他記憶體中的值是可以被修改的,例如通過指標.
在C++程式中
test02.cpp
const int b; 編譯報錯,在C++中const修改的就叫常量,定義的時候必須被初始化,由于是常量了
所以可以用來定義陣列的長度,如下代碼
例如3: C++代碼
const int b=100;
int array[b]={};
例如4: C++代碼
const int b=100;
int *p =(int )(&b);
p = 300;
print("%d %d %d",b,p,(&b));//列印結果是 100,300,100
這個結果為什么會和在C語言環境下的結果不一樣?
是因為C和C++編譯器對待const的編譯處理方式不一樣,在C語言中,const修飾的仍然被當做變數來編譯生成指令的
C++中.出現的被const修飾的常量名,在編譯的程序中都會被常量的初始化給替換掉的
所以上面 print("%d %d %d",b,p,(&b)); b 被替換成100, *(&b)會被編譯器優化掉 也是100
同時b在記憶體中的值被修改了,改成了300
注意
在C++中const 修飾同時被初始化的值是一個立即數,那么他就是個常量,如下
const int a = 100;
int *p = (int )(&a);
p=300;
print("%d %d %d",a,p,(&a));//列印結果是 100,300,100
編譯程序中 a都會被替換成被初始化的立即數100
但是如果用一個變數來初始化const修飾的量,就不再是常量了,會退化成常變數,本質上變成變數了 如下
int b=1;
const int a=b;
int arr[a]={};//這一行編譯報錯,因為a已經不再是常量了
int *p = (int )(&a);
p=300;
print("%d %d %d",a,p,(&a));//列印結果是 300,300,300,由于a已經不是常量了被退化成變數,這里就不再會被編譯替換了,列印的都是記憶體中的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522846.html
標籤:C++
