跳到主要内容
版本:master

变量

理解 GS 的变量是 GS 入门的关键一步。下面本章会用尽可能清晰的方式为你介绍变量的核心概念、作用,并通过一些简单示例帮助你建立直观感受。本章适用于没有编程基础或需了解 GS 变量的同学。阅读完本章后应了解变量的概念、声明、赋值、使用、作用域。

1 什么是变量?

你可以把变量想象成一个​​带标签的储物盒​​。这个盒子可以存放各种数据(比如数字、文字等),而标签就是变量的名字,帮助你识别盒子里装了什么。在程序运行过程中,你既可以查看盒子里的内容,也可以更换内容。

变量之所以叫“变量”,是因为它存储的值是​​可以改变​​的。例如,一个记录年龄的变量age,今年是25岁,明年就可以更新为26岁。

2 为什么需要变量?

变量在程序中扮演着至关重要的角色,主要有以下几个作用:

  • ​存储数据​​:临时或持久地保存程序运行中需要的数据,如用户输入、计算结果等。
  • ​动态管理​​:使程序能够灵活处理变化的数据和不同的情况。
  • ​提高代码可读性​​:一个有意义的变量名(如 studentAge)比直接使用晦涩的数字或字符(如 25)更能清晰表达意图,方便他人理解和维护代码。
  • ​支持运算和操作​​:变量可以参与各种计算和逻辑判断,是实现程序功能的基础。

3 变量如何工作?

在 GS 语言中,使用变量通常包含三个步骤:

  1. ​声明变量​​:告诉计算机“我要一个盒子”,并给它取个名字。
  2. ​变量赋值​​:把一个具体的值放进这个盒子里。
  3. ​使用变量​​:通过名字使用盒子里的值进行计算或操作。

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:局部变量与全局变量

5 编程实践:运用变量

让我们用变量来完成一个简单任务:​​计算一个人的身体质量指数(BMI)​​,BMI的计算公式是:​​体重(公斤)除以身高(米)的平方​​。

// 1. 将数据存入变量
float height = 1.82; // 单位:米
float weight = 86.5; // 单位:公斤

// 2. 利用变量进行计算
float bmi = weight / (height * height); // 计算BMI

// 3. 打印结果
printf("Height: %f meters\n", height);
printf("Weight: %f kilograms\n", weight);
printf("Your BMI is: {bmi:%.2f}\n", bmi);; // :.2f 表示保留两位小数

示例 5-1:变量简单实践

输出结果:

Height: 1.82 meters
Weight: 86.5 kilograms
Your BMI is: {bmi:26.11}

这个例子展示了变量如何让计算变得清晰且易于管理。如果想计算另一个人的BMI,只需修改heightweight变量的值即可,无需改动公式代码。

6 总结

变量是​GS中存储数据的基本单元​​,通过名字来访问和操作其中存储的值。理解变量的核心在于明白它是​​数据的容器​​,具有​​名称​​、​​类型​​、​​值​​和​​作用域​​等关键属性。

学习编程时,多动手练习定义变量、进行赋值和操作,是巩固概念的最佳方式。现在我们已经了解了 GS 的变量概念,接下来让我们学习常量的内容。