“C语言中的常变量”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的12个中间版本) | |||
第27行: | 第27行: | ||
[[文件:C语言中的常变量1.png|无|缩略图|800x800像素]]对局部变量 sum 加了 const 修饰之后,也是一样: | [[文件:C语言中的常变量1.png|无|缩略图|800x800像素]]对局部变量 sum 加了 const 修饰之后,也是一样: | ||
[[文件:C语言中的常变量2.png|无|缩略图|801x801像素]]原因就是加了 const 修饰之后,就由变量变成了常变量,可以读取值,但不能修改值。 | [[文件:C语言中的常变量2.png|无|缩略图|801x801像素]]原因就是加了 const 修饰之后,就由变量变成了常变量,可以读取值,但不能修改值。 | ||
+ | |||
+ | const 也可以加到类型声明后面: | ||
+ | [[文件:C语言中的常变量3.png|无|缩略图|800x800像素]] | ||
+ | 像上面“int const x = 0;”。 | ||
+ | |||
+ | 一般写成“int const x = 0;”这种 const 在类型声明后面的形式。<syntaxhighlight lang="c"> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | const int g_max = 10; //全局常变量 | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int const x = 0; //局部常变量 | ||
+ | const int sum = 20; //局部常变量 | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 为什么叫做“常变量”? === | ||
+ | 说它是常量,因为定义的是变量;说它是变量,它的值又不容许被改变。 | ||
+ | |||
+ | 所以就叫它“常变量”。 | ||
+ | |||
+ | |||
+ | |||
+ | === VS2019 和 VS2022 中默认局部变量未进行初始化编译报错 === | ||
+ | [[文件:未初始化局部变量编译报错.png|无|缩略图|1300x1300像素]] | ||
+ | |||
+ | |||
+ | |||
+ | === 全局变量未初始化,默认值是0 === | ||
+ | <syntaxhighlight lang="c"> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | int g_max; //全局变量未初始化,给的是0 | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | printf("g_max = %d \n", g_max); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight><syntaxhighlight lang="console"> | ||
+ | g_max = 0 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''<big>局部变量定义成 const 的时候,必须初始化,如果不初始化是没有意义的。</big>''' | ||
+ | |||
+ | '''<big>不管是全局常变量还是局部常变量,定义的时候必须初始化。</big>''' | ||
+ | |||
+ | '''<big>定义局部常变量的时候不进行初始化没有意义。</big>''' | ||
+ | |||
+ | |||
+ | === C中 const 的缺陷 === | ||
+ | <syntaxhighlight lang="c"> | ||
+ | #include<stdio.h> | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | const int len = 10; | ||
+ | int ar[len]; | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | [[文件:C语言中的常变量4.png|无|缩略图|728x728像素]] | ||
+ | c语言中,虽然用 const 修饰,但编译器仍然认为 len 是一个变量。 | ||
+ | |||
+ | 但 c++ 中的就可以这么写:<syntaxhighlight lang="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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | 可以正常编译运行。 | ||
+ | |||
+ | |||
+ | |||
+ | c中对常变量主要作为变量来考虑,不能用作数组大小的容量声明;c++中对常变量主要作为常量来考虑,可以用作数组大小的容量声明。 | ||
+ | |||
+ | 宏在预编译时替换,常变量在编译时替换; | ||
+ | |||
+ | 宏没有类型,不开辟空间,只是一种替换;常变量有类型,要进行检查,开辟空间,常变量比宏更加安全。 | ||
+ | |||
+ | |||
+ | |||
+ | '''<big>C++中不允许定义未初始化的全局常变量和局部常变量</big>''' |
2022年10月29日 (六) 02:28的最新版本
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 中默认局部变量未进行初始化编译报错
全局变量未初始化,默认值是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++中不允许定义未初始化的全局常变量和局部常变量