C&C++ 中const的不同

C中const示例

创建一个main.c文件如下

#include <stdio.h>
/*
C语言中
const修饰的量,可以不用初始化
不叫常量,叫做常变量
C中const就是当作变量来编译生成指令的
*/
int main()
{

	const int a;//C语言中常变量可以不给初值

	/*
	下面的语句将编译报错:error C4700: 使用了未初始化的局部变量“a”
	*/
	//printf("%d \n", a);

	/*
	下面语句将编译报错:error C2057: 应输入常量表达式, error C2466: 不能分配常量大小为 0 的数组
	*/
	//int array[a] = {};

	int* p = (int*)&a;
	*p = 30;
	printf("%d %d %d \n", a, *p, *(&a));
}

输出如下:

30 30 30

输出结果分析
在C中可能的情况:
a 被分配在栈内存中(可写区域)
编译器可能没有对const进行深度优化
所有访问都直接读取内存地址
因此输出:30 30 30

C++中const示例

示例1

#include <iostream>
int main()
{	
	const int a = 10;//常量(初始值是立即数)
	/*
	 下面语句error C3892: “a”: 不能给常量赋值
	*/
	//a = 30;//const修饰的变量不能够再作为左值!!!初始化完成后,值不能被修改!!!

	int array[a] = {};//可以正确编译

	int* p = (int*)&a;
	*p = 30;
	printf("%d %d %d \n", a, *p, *(&a));

	return 0;
}

输出如下:

10 30 10

示例2

int main()
{
	int b = 10;
	const int a = b;//常变量(初始值不是立即数)
	/*
	 下面语句编译报错 error C3892: “a”: 不能给常量赋值
	*/
	//a = 30;//const修饰的变量不能够再作为左值!!!初始化完成后,值不能被修改!!!

	/*
	下面语句编译报错 error C2131 : 表达式的计算结果不是常数
	*/	
	//int array[a] = {};

	int* p = (int*)&a;
	*p = 30;
	printf("%d %d %d \n", a, *p, *(&a));

	return 0;
}

输出如下:

30 30 30
posted @ 2025-10-19 12:25  焦涛  阅读(1)  评论(0)    收藏  举报