变量
理解 GS 的变量是 GS 入门的关键一步。下面本章会用尽可能清晰的方式为你介绍变量的核心概念、作用,并通过一些简单示例帮助你建立直观感受。本章适用于没有编程基础或需了解 GS 变量的同学。阅读完本章后应了解变量的概念、声明、赋值、使用、作用域。
1 什么是变量?
你可以把变量想象成一个带标签的储物盒。这个盒子可以存放各种数据(比如数字、文字等),而标签就是变量的名字,帮助你识别盒子里装了什么。在程序运行过程中,你既可以查看盒子里的内容,也可以更换内容。
变量之所以叫“变量”,是因为它存储的值是可以改变的。例如,一个记录年龄的变量age,今年是25岁,明年就可以更新为26岁。
2 为什么需要变量?
变量在程序中扮演着至关重要的角色,主要有以下几个作用:
- 存储数据:临时或持久地保存程序运行中需要的数据,如用户输入、计算结果等。
- 动态管理:使程序能够灵活处理变化的数据和不同的情况。
- 提高代码可读性:一个有意义的变量名(如
studentAge)比直接使用晦涩的数字或字符(如25)更能清晰表达意图,方便他人理解和维护代码。 - 支持运算和操作:变量可以参与各种计算和逻辑判 断,是实现程序功能的基础。
3 变量如何工作?
在 GS 语言中,使用变量通常包含三个步骤:
- 声明变量:告诉计算机“我要一个盒子”,并给它取个名字。
- 变量赋值:把一个具体的值放进这个盒子里。
- 使用变量:通过名字使用盒子里的值进行计算或操作。
3.1 变量的声明
GS 中变量在声明时需明确类型, 以类似如下方式声明类型:
variable_type variable_name;variable_type variable_name = variable_value;
int age; // 整数
string name; // 字符串
bool isStudent = true; // 布尔值
示例3-1:GS中变量的声明
3.2 变量赋值
GS 中变量在使用前必须进行赋值操作,以 '=' 为需要的变量赋值:
int age = 18; // 在变量声明的同时进行赋值
string name;
name = "user"; // 在变量声明后进行赋值
示例3-2:GS中变量的赋值
在GS中还有一些特殊的以 := 赋值情况,会在后面的只读与并行章节说明。
3.3 变量的使用
GS 中变量可以用作函数的输入参数,表达式计算的原操作数,数组(array)或表(map)的索引等...。
int year = 2025;
write(year); // 使用变量作为函数的输入参数
int next_year = year + 1; // 使用变量作为运算符源操作数
write(next_year);
map year_map = { 2025 : "In 2025, yeah!"}
write(year_map[year]); // 使用变量作为表(map) 索引
示例3-3:GS中变量的使用
注意在 GS 中,在函数中定义的局部变量若只有变量的定义但没有变量的使用,比如如下代码:
void test()
{
int year = 2025; // 定义了整型 year 变量但未使用的 year 变量
}
示例3-4:GS中变量定义但没有使用
为了避免相近变量名称在使用时混淆导致有变量定义了但未被使用,编译器会对定义但未使用的局部变量报出如下警告:
/src/helloworld.gs(3): warning C-603: Variable 'year' is declared but not used.
在撰写程序时,应注编译器的所有警告与报错信息。即时修改程序以避免警告与报错产生是一个极好的习惯。
4 变量的重要特性
4.1 数据类型
变量通常有类型之分 ,决定了它能存放什么类型的数据以及能进行哪些操作。一旦类型确定,对定义为此类型的变量的很多操作就确定了。例如,数字可以进行乘除,但字符串通常只能进行拼接、截取等操作。
进一步的具体的类型信息与会在后续章节介绍并给出。
4.2 变量命名
给变量起个好名字非常重要。好的变量名能让人一眼就知道它存的是什么数据。
- 基本规则:名字通常只能包含字母、数字和下划线,且不能以数字开头。也不能使用编程语言中的关键字(如
if,for,int等)。 - 惯例与规范:
- 使用有意义的英文单词或词组,例如用
user_name而不是ua。 - 避免使用拼音或中文。
- 常见的命名风格有蛇形命名法 (形如
my_variable_name) 和驼峰命名法 (形如myVariableName)
- 使用有意义的英文单词或词组,例如用
4.3 作用域
GS 变量的作用域指的是它在程序中的可见和可用的范围。
一个在函数内部定义的变量(局部变量),通常不能在函数外部使用;
而在程序最外层定义的变量(全局变量,object 变量),则可以在程序的许多地方访问。理解作用域能帮助你更好地组织代码,避免意外修改 和命名冲突。
// 全局变量:在函数外部定义,当前整个程序都可访问,同时全局变量不要求定义在函数内部的使用前。
int player_health = 100; // 玩家的初始血量
void take_damage()
{
// write(attack_power); //错误代码,局部变量不能 在其声明之前访问
// 局部变量:在函数内部定义,仅在此函数内有效
int attack_power = 25; // 单次攻击力
// 要修改全局血量变量,减去收到伤害
player_health -= attack_power;
// 可以使用在函数之后定义的全局变量 player_mp
printf("Received %d points of damage! Remaining HP: %d, Remaining MP: %d\n",attack_power, player_health, player_mp);
}
int player_mp = 50; // 玩家的初始法力值,
// write(attack_power); //错误代码,局部变量不能在其作用域外部访问
// 查看初始状态
printf("Player's initial health: %d\n", player_health);
// 模拟游戏过程
take_damage(); // 玩家受到一次攻击
示例 4-1:局部变量与全局变量的使用
输出结果:
Player's initial health: 100
Received 25 points of damage! Remaining HP: 75, Remaining MP: 50
需要注意的时,为了避免编程中混淆局部变量与全局变量造成的问题,GS 禁止局部变量与全局变量同名,如下示例:
int player_health = 100; // 玩家的初始血量
void take_damage()
{
int player_health = 100; // 报错,局部变量不能与全局变量同名
}
示例 4-2:局部变量与全局变量同名报错 输出结果:
E:/HelloWorld/helloworld/src/helloworld.gs(4): error C1999: Variable 'player_health' already defined at file '/src/helloworld.gs' line '1'.
At /src/helloworld.gs
Error occurs when booting...
Error(-1): Compile /src/helloworld.gs failed.
此处的全局变量通常也被称为 object 变量,因为各个 .gs 文件最终都是封装为 object 实例执行的的,详细信息在后续的 object 章节给出。 示例 4-1:局部变量与全局变量