AMXXPawn 跳转标签

在函数体内可使用:符号声明一个跳转标签(Label)。

在同一个函数体内,可使用goto关键字编写“跳转语句”,被执行时跳转到标签位置,执行其它代码。

点击查看跳转语句指南

用goto和跳转标签模拟循环语句:

public plugin_precache() { // 生成Init标签,模拟for循环语句的初始化语句位置 Init: server_print("来到Init位置执行代码."); new counter = 1; // 生成Continue标签,模拟for循环语句的条件表达式位置 Continue: server_print("第%d次来到Continue位置执行代码.", counter); if (counter < 10) { // 模拟for循环语句的循环体入口 // 这里填写for循环体内代码 // 可用goto Continue模拟continue关键字 // 可用goto Break和break关键字 server_print("第%d次进入循环体.", counter); // 模拟for循环语句的迭代语句 counter++; // 跳转到Continue:位置 goto Continue; } // 生成Break标签,模拟for循环语句的循环体出口位置 Break: server_print("来到Break位置执行代码."); }

for循环语句参考:

public plugin_precache() { // for (初始化语句; 条件表达式; 迭代语句) for (new counter = 1; counter < 10; counter++) { // 循环体入口 server_print("第%d次进入循环体.", counter); } // 循环体出口 }

题外话:

  • defined可以检查跳转标签是否存在,仅在同一函数体内,标签生成语句下方,才会返回true,不被代码块局限
  • 虽然没什么用,但tagof可以获取跳转标签的值类型标签uid
  • 值类型标签覆盖不能出现在语句开头,否则变成跳转标签生成,需用括号区分:
  • public plugin_precache() { // 这里的_:是正常的'值类型标签覆盖'语法 new a = _:1.0; // 加上括号Float:是'值类型标签覆盖' (Float:a) += 1.0; // 不加括号Label:是'跳转标签生成' Label: // 这会生成Float跳转标签,遮蔽Float值类型标签 Float:a += 1.0; }