C语言中的常变量

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2022年10月29日 (六) 02:28的版本 →‎C中 const 的缺陷
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

https://www.bilibili.com/video/BV1vR4y1H7MY/?p=11

用 const 关键字修饰的变量,称为常变量。// c const // c++ const

变量:可读可写;

常量:只可读不可写;

常变量:?

示例:

#include<stdio.h>

int g_max = 10; //全局变量

int main()
{
	int x = 0;
	int sum = 20;
	g_max = 100; //普通全局变量可以被赋值
	printf("g_max = %d \n", g_max);
	return 0;
}
g_max = 100

也就是说普通全局变量可以被修改,但加入 const 修饰全局变量以后则不能对全局变量再进行赋值修改,否则发生编译报错:

生成缩略图出错:无法将缩略图保存到目标地点

对局部变量 sum 加了 const 修饰之后,也是一样:

生成缩略图出错:无法将缩略图保存到目标地点

原因就是加了 const 修饰之后,就由变量变成了常变量,可以读取值,但不能修改值。

const 也可以加到类型声明后面:

生成缩略图出错:无法将缩略图保存到目标地点

像上面“int const x = 0;”。

一般写成“int const x = 0;”这种 const 在类型声明后面的形式。

#include<stdio.h>

const int g_max = 10; //全局常变量

int main()
{
	int const x = 0; //局部常变量
	const int sum = 20; //局部常变量
	return 0;
}

为什么叫做“常变量”?

说它是常量,因为定义的是变量;说它是变量,它的值又不容许被改变。

所以就叫它“常变量”。


VS2019 和 VS2022 中默认局部变量未进行初始化编译报错

未初始化局部变量编译报错.png


全局变量未初始化,默认值是0

#include<stdio.h>

int g_max; //全局变量未初始化,给的是0

int main()
{
	printf("g_max = %d \n", g_max);
	return 0;
}
g_max = 0

局部变量定义成 const 的时候,必须初始化,如果不初始化是没有意义的。

不管是全局常变量还是局部常变量,定义的时候必须初始化。

定义局部常变量的时候不进行初始化没有意义。


C中 const 的缺陷

#include<stdio.h>

int main() 
{
	const int len = 10;
	int ar[len];
	return 0;
}
生成缩略图出错:无法将缩略图保存到目标地点

c语言中,虽然用 const 修饰,但编译器仍然认为 len 是一个变量。

但 c++ 中的就可以这么写:

#include<stdio.h>

const int g_max = 0;

int main()
{
	const int x = 0;
	const int len = 10;
	int ar[len] = {1,2,3,4,5,6,7,8,9,10};
	return 0;
}

可以正常编译运行。


c中对常变量主要作为变量来考虑,不能用作数组大小的容量声明;c++中对常变量主要作为常量来考虑,可以用作数组大小的容量声明。

宏在预编译时替换,常变量在编译时替换;

宏没有类型,不开辟空间,只是一种替换;常变量有类型,要进行检查,开辟空间,常变量比宏更加安全。


C++中不允许定义未初始化的全局常变量和局部常变量