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
浙公网安备 33010602011771号