运算符
理解运算符是入门的关键一步,它们就 像是 GS 中的“数学工具和逻辑符号”,让 GS 能够进行各种计算和决策。下面我会用尽可能清晰的方式为你介绍运算符的核心概念,并通过一些相关的示例帮助你建立直观感受。本章适用于没有编程基础或需了解 GS 运算符的同学。阅读完本章应了解 GS 中运算符的概念与常用的运算符曹祖。
1 什么是运算符?
运算符是 GS 中用于执行各种操作的符号,它们可以对一个或多个值(称为操作数)进行运算,并产生结果。就像数学中的加减乘除符号一样,运算符让程序能够进行数学计算、比较大小、逻辑判断等操作。
2 为什么需要运算符?
运算符是构建程序逻辑的基石,它们的主要作用包括:
- 执行数学计算:处理游戏中的分数计算、角色属性增减等。
- 进行比较判断:判断游戏中的条件,如玩家是否达到过关要求、角色是否碰撞等。
- 控制程序流程:通过逻辑运算决定程序的不同执行路径。
- 操作内存和数据:对数据进行更底层的操作和处理。
3 运算符的主要类型
3.1 算术运算符:处理数值计算
算术运算符用于执行基本的数学运算,它们在 GS 编程中无处不在。
| 运算符 | 含义 | 游戏示例 | 伪代码示例 |
|---|---|---|---|
+ | 加法 | 玩家得分增加 | score = score + 100; |
- | 减法 | 角色生命值减少 | health = health - damage; |
* | 乘法 | 计算技能伤害倍数 | total_damage = base_damage * multiplier; |
/ | 除法 | 分配战利品 | each_player_gold = total_gold / players_count; |
% | 取模(求余) | 循环关卡或回合 | current_level = turns % total_levels; |
//示例:角色经验值计算
int base_exp = 100;
float level_multiplier = 2.5;
int bonus_exp = 50;
float total_exp = base_exp * level_multiplier + bonus_exp;
printf("get total exp: %f", total_exp);
示例 3-1:算数运算符使用
输出结果如下:
get total exp: 300.0
3.2 比较运算符:进行大小判断
比较运算符用于比较两个值的关系,返回布尔值(true或false),广泛应用于条件判断中。
| 运算符 | 含义 | 游戏示例 | 伪代码示例 |
|---|---|---|---|
== | 等于 | 检查玩家是否到达目标点 | if(player.position == target.position) |
!= | 不等于 | 检查敌人是否存活 | if(enemy.state != "dead") |
> | 大于 | 检查得分是否超过记录 | if(currentScore > highScore) |
< | 小于 | 检查生命值是否危险 | if(health < lowHealthThreshold) |
>= | 大于等于 | 检查等级是否足够 | if(playerLevel >= requiredLevel) |
<= | 小于等于 | 检查背包是否已满 | if(inventorySize <= maxSize) |
以下
// 示例:游戏通关条件判断
int player_score = 850;
int required_score = 1000;
int enemies_defeated = 15;
bool all_enemies_defeated = false;
bool level_passed = (player_score >= required_score) || all_enemies_defeated;
printf("level pass: %O\n", level_passed);
示例 3-2:通关条件判断
输出结果如下:
get total exp: 300.0
3.3 逻辑运算符:组合多个条件
逻辑运算符用于组合多个条件,用于实现负载条件判断。
| 运算符 | 含义 | 游戏示例 | 伪代码示例 |
|---|---|---|---|
&& | 与 | 需要钥匙且门未解锁 | if (hasKey && !doorUnlocked) |
| ` | ` | 或 | |
! | 非 | 角色不处于无敌状态 | if (!player.isInvincible) |
// 示例:游戏角色特殊技能释放条件
bool has_mana = true;
bool mana_sufficient = false;
bool skill_ready = true;
bool target_in_range = false;
bool can_cast_spell = has_mana && (mana_sufficient || skill_ready) && target_in_range;
printf("Can cast spell: %O\n", can_cast_spell);
示例 3-3:复杂条件判断
输出结果如下:
Can cast spell: false
3.4 赋值运算符:简化代码书写
赋值运算符用于给变量赋值,复合赋值运算符可以简化代码。
| 运算符 | 示例 | 等价于 | 游戏使用场景 |
|---|---|---|---|
+= | x += 3 | x = x + 3 | 玩家得分增加 |
-= | x -= 2 | x = x - 2 | 生命值减少 |
*= | x *= 2 | x = x * 2 | 伤害值翻倍 |
/= | x /= 2 | x = x / 2 | 速度减半 |
// 游戏示例:玩家状态更新
int health = 100;
float attack_power = 25;
int score = 0;
// 玩家受到伤害
health -= 15;
// 玩家获得攻击增益
attack_power *= 1.5;
// 玩家击败敌人得分
score += 150;
printf("State: health={%O}, attack={%O}, score={%O}", health, attack_power, score);
示例 3-4:赋值运算符 输出结果如下:
State: health={85}, attack={37.5}, score={150}
4 运算符优先级与结合性
当表达式中包含多个运算符时,运算符的优先级决定了运算的执行顺序。以下是从高到低的主要优先级顺序(部分常见运算符):
| 序号 | 运算符 | 结合性 |
|---|---|---|
| 1 | () , [] | 从左向右 |
| 2 | !(非) , +(正) , -(负) , ~(按位非) , ++ , -- | 从左向右 |
| 3 | * , / , % | 从左向右 |
| 4 | +(加) , -(减) | 从左向右 |
| 5 | <<(左移) , >>(右移) | 从左向右 |
| 6 | < , <= , > , >= | 从左向右 |
| 7 | == , != | 从左向右 |
| 8 | &(按位与) | 从左向右 |
| 9 | ^(按位异或) | 从左向右 |
| 10 | 一竖(按位或) | 从左向右 |
| 11 | &&(与) | 从左向右 |
| 12 | 两竖(或) | 从左向右 |
| 13 | ?: | 从右向左 |
| 14 | = , += , -= , *= , /= , %= , &= , |= , ^= , ~= , <<= , >>= | 从右向左 |
理解运算符优先级与结合行能够帮助我们正确的理解表达式的计算顺序,避免错误理解表达式的计算结果。以下是一些简单的可能会被混淆计算顺序的的表达式示例:
| 示例表达式 | 预期(可能错误) | 实际求值顺序(根据优先级和结合性) |
|---|---|---|
5 + 2 * 3 | ((5+2)*3) | 先乘后加:5 + (2 * 3) |
a = b = c = 0 | - | 从右向左赋值:a = (b = (c = 0)) |
!flag && isValid | - | 先非后与:(!flag) && isValid |
x & 1 == 0 | x & (1==0) | 先关系运算后位运算:x & (1 == 0),若想先位运算,需加括号(x & 1) == 0 |
3 + 4 << 2 | (3+4)<<2? | 先加后移:(3 + 4) << 2 -> 7 << 2 -> 28 |
5 总结
运算符是 GS 编程中用于执行各种操作的符号,是构建程序逻辑的基础工具。理解运算符的核心在于掌握每种运算符的作用、优先级以及它们在实际场景中的应用。试着用这些运算符编写一些简单的逻辑,这是巩固概念的最佳方式。
🎊 恭喜你已经完成了语言基础章节的教程学习,接下来让我们学习 GS 的内存管理部分的概念及内容。