1. C语言中被const修饰的叫常变量
#include <stdio.h>
void main() {
const int v; //ok
}
C语言中,const修饰的量可以不初始化,但是之后再想修改就不能修改了。
但是他始终是被当作一个变量看待的,比如:
void main() {
const int n = 100;
int arr[n] = { }; //error
}
这里报错是因为C语言中,即使名字前面有个‘常’字,但是它终归是个变量,不能用在应该使用常量的地方,不能作为左值;
与普通的变量区别体现在定义后就不能修改这一点上,再没有其它差别。
C语言中const修饰的变量可以通过地址修改:
void main() {
const int n = 100;
int* p = (int*)&n;
*p = 60;
printf("%d %d %d\n",n,*p,*(&n));
}
输出结果,n的值可以被改变:
60 60 60
2. C++中的const修饰的量的性质:与其初始化值的性质有关
c++中const不能不初始化:
int main() {
const int n; /error
return 0;
}
初始化值的性质:
int main() {
int a = 9;
const int n = a;//not initialized with a constant expression;此时n为常变量
const int n2 = 9;//initialized with a constant expression;此时n2为常量、常量表达式
return 0;
}
- 采用常量或常量表达式进行初始化,则const量的性质为常量;
- 采用变量或变量表达式进行初始化,则const量的性质为常变量;(C++中,数组的大小可以为 常变量;)
测试样例:
int test1()
{
const int n = 100;//使用常量进行初始化, 性质为常量
int* p = (int*)&n;
*p = 60;
printf("%d %d %d\n",n,*p,*(&n)); // 输出结果: 100 60 100
return 0;
}
int test2()
{
int a = 100;
const int n = a;使用变常量进行初始化,性质为常变量
int* p = (int*)&n;
*p = 60;
printf("%d %d %d \n",n,*p,*(&n) );// 输出结果: 60 60 60
return 0;
}
int test3()
{
const int a = 100*2;//使用常量表达式进行初始化, 性质为常量
const int n = a;//n的初始化方式与a的相同,性质也相同
int* p = (int*)&n;
*p = 60;
printf("%d %d %d \n",n,*p,*(&n) ); // 输出结果:200 60 200
return 0;
}
int main(int argc, char** argv)
{
test1();
test2();
test3();
return 0;
}
输出结果:
3.总结
- const量的内存值均可通过指针的方式进行修改;
- 所有出现const量名字的地方,都被对应的 初始化值 进行类似文本替换一样的替换掉了。
- 性质为常变量的const量,其值与内存值相关联,在编译阶段,需要去内存中寻址取值;
- 性质常量的const量,其值与内存值无关,等于初始化值,在编译阶段,类似文本替换一样;在编译阶段,不再去内存中寻址取值,即使修改了对应内存中的值,也对其使用值无影响;
- C语言中,const量无论其初始化方式,都是被当作常变量处理;
- 在C++中,根据其初花值的不同,const量可表现为常量,也可表现为常变量;