GS中的常量
理解常量是 GS 学习中的重要一步。下面我会用简单的语言介绍常量的核心概念、作用,并通过一些示例帮助你理解。本章节同样面向无编程基础或需要了解 GS 常量的同学。阅读完本章后应了解常量的概念、定义、使用。
1 什么是常量?
常量就是在程序运行过程中,其值不会被改变的量。你可以把它想象成生活中的“固定规则”,比如一周有7天,圆周率π约等于3.14。这些值一旦确定,就不会因程序运行而改变。
与变量不同,常量的值在赋值后就不能再修改,这为程序提供了一致性和稳定性。
2 为什么需要常量?
使用常量主要能带来这些好处:
- 提高代码可读性:给固定值起一个有意义的名字(如
MAX_SPEED),比直接使用数字(如100)更能清晰表达意图,方便他人理解和维护代码。 - 增强代码可维护性:如果需要修改这个固定值,只需在常量定义处修改一次即可,无需在整个代码中查找和替换多个相同的字面值,减少错误。
- 避免“魔法数字”:直接出现在代码中缺乏明确含义的数字或字符串被称为“魔法数字”(Magic Number),使用常量可以避免这种情况,使代码逻辑更清晰。
- 保证数据一致性:常量的值不可变,可以防止程序运行过程中重要的值被意外修改,增强代码的稳定性。
3 常量的定义
GS 中要定义常量时需在变量声明时在类型前添加 const 关键字,用于存储不会改变的数据。常量的定义格式:const [type] identifier = value;示例如下:
// 定义常量
// const float CONST_NO_INIT; // 错误,常量在声明阶段必须初始化并赋值。
const float PI_NUM = 3.14159;
const int MAX_CONNECTIONS = 100;
const string COMPANY_NAME = "g-bits";
// MAX_CONNECTIONS = "200"; // 错误,常量不能被修改。
// 使用常量
int radius = 5;
float area = PI_NUM * (radius * radius);
writeln(area);
writeln("Our company name:", COMPANY_NAME);
示例 3-1:常量的定 义与使用 运行结果如下:
78.53975
Our company name:g-bits
- 使用常量与使用变量类似,但需要注意的是常量在声明阶段必须初始化赋值,以及常量不能被修改。
- 常量的值必须是能够在编译时就能够确定的;你可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。
- 正确的做法:const int c1 = 2+3;
- 错误的做法:const int c2 = getNumber();
4 常量的命名规范
为了与变量区分, 并提醒开发者不要修改其值,常量通常遵循全大写字母的命名规范,单词之间用下划线 (_) 分隔。
例如:MAX_SPEED, PI, DEFAULT_TIMEOUT。
5 常量的类型
GS 中常量可以有不同的数据类型,可以是bool, int, string, map等, 比如:
const float PI_NUM = 3.14159;
const int MAX_CONNECTIONS = 100;
const string HELLO_STR = "Hello";
const buffer HI_BUF = (buffer)"Hi";
const array PLAYER_IDS = ["0001", "0002", "0003"];
const map EQUIP_NAME = {
"weapon":"武器",
"cloth" : "防具",
"accessories" : "饰品",
"shoes" : "鞋子",
"fabao" : "法宝",
"gubao" : "古宝"
};
writeln(PI_NUM);
writeln(MAX_CONNECTIONS);
writeln(HELLO_STR);
writeln(HI_BUF);
writeln(PLAYER_IDS);
writeln(EQUIP_NAME);
示例 5-1:不同类型的常量 输出结果如下:
3.14159
100
Hello
48 69 Hi..............
[ /* sizeof() == 3 */
"0001",
"0002",
"0003",
]
{ /* sizeof() == 6 */
"weapon" : "武器",
"cloth" : "防具",
"accessories" : "饰品",
"shoes" : "鞋子",
"fabao" : "法宝",
"gubao" : "古宝",
}
6 编程实践:运用常量
使用常量以避免意外修改,保证统一修改以及减少拼写错误等.
6.1 避免意外修改
常量一旦初始化,其值就不能再被改变。这可以防止在代码的其他地方意外地修改它,从而避免难以察觉的 bug。
const int MAX_RETRY_TIMES = 3;
// ... 很多行代码之后 ...
MAX_RETRY_TIMES = 5; // 如果取消注释,编译器会报错,阻止这种可能带来逻辑错误的赋值。
示例6-1:使用常量避免意外修改 编译器报错如下:
Can not assign to a constant value.
6.2 保证统一更改
如果同一个字面量在代码中出现多次,需要修改时就必须找到所有地方逐一修改,很容易遗漏或出错。
假设一个文件路径在多个地方使用:
string file_content = file.read_all("./config.txt");
file.write_all("./config.txt", "{}");
string reread_file_content = file.read_all("./config.txt");
示例6-2:同一路径多处使用示例
若要修改配置文件路径,我们维护时需要逐一查找并修改所有的位置的路径字符但我们若将路径定义为常量,就可以方便的统一修改所有使用的路径,如下:
const string CONFIG_PATH = "./config.json";
string file_content = file.read_all(CONFIG_PATH);
file.write_all(CONFIG_PATH, "{}");
string reread_file_content = file.read_all(CONFIG_PATH);
示例6-3:避免重复修改示例
这样我们只用修改路径常量 CONFIG_PATH 的初始化值就可修改所有重复的路径配置.
这样做的优势非常明显:
- 可读性增强:
CONFIG_PATH比 "./config.txt" 更能表达其含义。 - 维护性提高:若要提高计算精度,只需修改
CONFIG_PATH一处的值。 - 减少错误:避免了在代码中多次输入 "./config.txt" 可能带来的笔误。
7 总结
GS 中常量是程序中存储固定不变数据的标识符。理解常量的核心在于明白它是一旦定义便不可更改的值,通过有意义的命名来提升代码质量。
主要记住以下几点:
- 不可变:常量的值在定义后不应被修改。
- 命名全大写:使用大写字母和下划线来命名,以便与变量区分。
- 避免魔法数字:用有名字的常量代替代码中直接出现的、含义不明确的数字或字符串。
- 提升代码质量:合理使用常量可以使代码更清晰、更易维护、更稳定。
对于 GS 初学者来说,养成使用常量的好习惯,从一开始就写出更规范的代码。接下来我们来了解类型的概念,并初次接触 GS 的类型。