先说总结,它的区别如下表:
分析代码如下:
#include <iostream>
using namespace std;
//************例1【C语言】***********
int main()
{
const int a = 10;
int arr[a] ={0}; //error
int *p = (int*)&a; //ok (a没有作为左值存在,故可成功)
*p = 30;
printf("%d\n",a); //30
printf("%d\n",*p); //30
return 0;
}
/*总结:在C语言中,const修饰的常变量和普通变量的唯一区别:
常变量定义以后,不可作为左值存在。*/
//************例2【C++语言】***********
int main()
{
const int a = 10;
int arr[a] = {0}; //ok
int *p = (int*)&a;
*p = 30;
cout<<a<<endl; //10 (这里发生了替换,遇到a替换成10,故打印出10)
cout<<*p<<endl; //30
return 0;
}
//************例3【C++语言】***********
int main()
{
int b = 20;
const int a = b;
int arr[a] = {0}; //error(编译阶段a的值不明确,故当作常变量来处理)
int *p = (int*)&a;
*p = 30;
cout<<a<<endl; //30
cout<<*p<<endl; //30
return 0;
}
//总结:C++中,常量——退化为——>常变量(当引用一个编译阶段不明确的值)