03-21-2026, 11:04 PM
[wiki系列] openmp/samp 控制结构
来自 SA-MP Wiki
目录
- 1 条件语句
- 1.1 if
- 1.2 运算符
- 1.3 括号
- 1.4 else
- 1.5 else if
- 1.6 ?:(三元运算符)
- 2 循环
- 2.1 while ()
- 2.2 for ()
- 2.3 do-while
- 2.4 if-goto
- 2.5 OBOE(Off By One Error)
- 3 switch
- 3.1 switch
- 3.2 case
- 3.3 default
- 4 单行语句
- 4.1 goto
- 4.2 break
- 4.3 continue
- 4.4 return
条件语句
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?");
}有两种可能的解释:
(a == 5 && b == 3) || c == 1
a == 5 && (b == 3 || c == 1)
第一种:先判断
a==5 && b==3(为假),再判断 c==1(为真),整体为真。 第二种:先判断
b==3 || c==1(为真),再判断 a==5(为假),整体为假。强烈建议始终使用括号,既能明确逻辑,也能避免歧义。
else
else 在 if 条件不成立时执行:代码:
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/

