samp | open.mp 联机社区论坛
[wiki系列] openmp/samp 控制结构 - 打印版本

+- samp | open.mp 联机社区论坛 (https://open-mp.cn)
+-- 板块: SA-MP (https://open-mp.cn/forumdisplay.php?fid=12)
+--- 板块: 教程 (https://open-mp.cn/forumdisplay.php?fid=17)
+--- 主题: [wiki系列] openmp/samp 控制结构 (/showthread.php?tid=20)



[wiki系列] openmp/samp 控制结构 - 小鸟unsigned - 03-21-2026

[wiki系列] openmp/samp 控制结构



来自 SA-MP Wiki



目录





条件语句



if



if 语句会检查某个条件是否成立,如果成立则执行对应代码。

代码:
new
    a = 5;
if (a == 5)
{
    print("a is 5");
}

if 后面的括号内是条件,你可以进行多种判断(详见运算符部分)。

条件中不仅可以是变量,也可以是函数:

代码:
if (SomeFunction() == 5)
{
    print("SomeFunction() is 5");
}

还可以组合多个条件:

代码:
new
    a = 5,
    b = 3;
if (a == 5 && b != 3)
{
    print("Won't be printed");
}

上面检查 a == 5 并且 b != 3,但 b 是 3,所以整个条件为假。

使用 ||(或):

代码:
new
    a = 5,
    b = 3;
if (a == 5 || b != 3)
{
    print("Will be printed");
}

只要有一个条件为真,整个 if 就成立(即使 b != 3 为假,因为 a == 5 为真)。

还可以链式比较(无需显式写多个 &&):

代码:
new
    idx = 3;
if (0 < idx < 5)
{
    print("idx is greater than 0 and less than 5!");
}

运算符



条件判断中常用的运算符及其含义:

比较运算符


                                                                                                               
运算符含义示例
==左边等于右边if (Left == Right)
!=左边不等于右边if (Left != Right)
>左边大于右边if (Left > Right)
>=左边大于等于右边if (Left >= Right)
<左边小于右边if (Left < Right)
<=左边小于等于右边if (Left <= Right)

逻辑运算符


                                                                                                                                       
运算符含义示例
&&并且(AND)if (Left && Right)
或者(OR)if (Left || Right)
!非(NOT)if (!Variable)
都不(NOR)if (!(Left || Right))
不是都(NAND)if (!(Left && Right))
异或(XOR)if (!(Left && Right) && (Left || Right))
同或(NXOR)if ((Left && Right) || !(Left || Right))

括号



括号决定运算顺序:

代码:
new
    a = 3,
    b = 3,
    c = 1;
if (a == 5 && b == 3 || c == 1)
{
    print("Will this be called?");
}

有两种可能的解释:

  1. (a == 5 && b == 3) || c == 1 
  2. a == 5 && (b == 3 || c == 1)

第一种:先判断 a==5 && b==3(为假),再判断 c==1(为真),整体为真。 
第二种:先判断 b==3 || c==1(为真),再判断 a==5(为假),整体为假。

强烈建议始终使用括号,既能明确逻辑,也能避免歧义。

else



elseif 条件不成立时执行:

代码:
new
    a = 5;
if (a == 3)  // 假
{
    print("Won't be called");
}
else
{
    print("Will be called as the check failed");
}

else if



else if 用于在第一个 if 不成立时继续检查其他条件:

代码:
new
    a = 5;
if (a == 1)
{
    print("Will be called if a is 1");
}
else if (a == 5)
{
    print("Will be called if a is 5");
}
else
{
    print("All other numbers");
}

你可以连续写多个 else if,但一个 if 组中只能有一个 else

注意else if 只在最初的 if 失败时才检查,且变量值以检查开始时的状态为准。

?:(三元运算符)



?: 组合成三元运算符,可将 if-else 写在单行内:

代码:
new
    a,
    b = 3;
if (b == 3)
{
    a = 5;
}
else
{
    a = 7;
}

可简化为:

代码:
new
    a,
    b = 3;
a = (b == 3) ? 5 : 7;

(条件) ? 真值 : 假值

也可以嵌套(类似多个 else if):

代码:
new
    a,
    b = 3;
a = (b == 1) ? 2 : (b == 2) ? 3 : (b == 3) ? 4 : 5;



循环



while ()



while 循环在条件成立时重复执行代码:

代码:
new
    a = 9;
while (a < 10)
{
    // 循环内的代码
    a++;
}

每次到达 } 时会回到条件重新判断。

for ()



for 是压缩版的 while 循环,包含三部分:初始化、条件、递增。

代码:
for (new a = 9; a < 10; a++)
{
    // 循环内的代码
}

常用遍历玩家示例:

代码:
for (new i, a = GetMaxPlayers(); i < a; i++)
{
    if (IsPlayerConnected(i))
    {
        // do something
    }
}

三部分均可省略(留空):

代码:
new a = 9;
for ( ; a < 10; )
{
    a++;
}

do-while



do-while 先执行代码,再判断条件,因此至少执行一次

代码:
new
    a = 10;
do
{
    // 循环内的代码
    a++;
}
while (a < 10);  // 注意分号

if-goto



循环本质上就是 if + goto 的结构化形式(不推荐直接使用 goto):

代码:
new
    a = 9;
loop_start:
if (a < 10)
{
    // 循环内的代码
    a++;
    goto loop_start;
}

OBOE(Off By One Error)



OBOE 是最常见的循环错误之一——循环多跑或少跑一次。

代码:
new
    a = 0,
    b[10];
while (a <= sizeof (b))
{
    b[a] = 0;
}

上面会尝试访问 b[10](越界),导致 OOB(Out Of Bounds)错误。

特别注意do-while 永远至少执行一次,更容易出现 OBOE。



switch



switch



switch 是结构化的 if / else if / else,更清晰:

代码:
new
    a = 5;
switch (a)
{
    case 1:
    {
        // 不会执行
    }
    case 2:
    {
        // 不会执行
    }
    case 5:
    {
        // 会执行
    }
    default:
    {
        // 不会执行
    }
}

switch 只调用一次判断表达式(比连续 else if 更高效)。

case



case 支持单个值、列表或范围:

代码:
case 1, 2, 3, 4:    // 列表
case 1 .. 4:        // 范围(推荐连续数字)

default



相当于 else,所有 case 都不匹配时执行。



单行语句



goto



goto 直接跳转到标签(不推荐使用,会破坏程序流程)。

break



break 立即跳出当前循环:

代码:
for (new a = 0; a < 10; a++)
{
    if (a == 5) break;
}

continue



continue 跳过本次循环剩余代码,直接进入下一次迭代:

代码:
for (new a = 0; a < 3; a++)
{
    if (a == 1) continue;
    printf("a = %d", a);
}

输出:

代码:
a = 0
a = 2

注意:在某些循环(尤其是 while)中使用 continue 时要小心,可能导致无限循环。

return



return 立即结束当前函数,返回到调用处:

代码:
main()
{
    print("1");
    MyFunction(1);
    print("3");
}
MyFunction(num)
{
    if (num == 1)
    {
        return;  // 直接返回,不执行下面的 print
    }
    print("2");
}

输出:

代码:
1
3

也可以返回具体值:

代码:
return 27;

注意:如果函数有时返回值,有时不返回值,必须在所有路径都显式 return 一个值。



#GTA# #圣安地列斯# #侠盗猎车手# #圣安地列斯联机# #samp# #gta联机# #gtasa联机# #openmp# #omp# #open.mp# #gtasa#

社区交流群: 673335567

论坛: https://open-mp.cn/