C++/C中const的区别 - 不同初始化方式对C++中const量性质的影响


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量可表现为常量,也可表现为常变量;

参考:

C++/C中const的区别(常量和常变量)_KingOfMyHeart的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值