AngelScript 声明

目录


变量声明

在任何语句块或任何子模块使用变量之前,必须声明变量

例如

//声明变量
int number;
//可以为变量赋上同类型的初始值
int var = 2;
//可以以关键词const声明变量为只读属性,该情况下此变量将会被视作静态
const float pi = 3.1415926f;
//使用@声明句柄对象,详见句柄一章
object@ handle = null;

//使用了未声明的变量,将会报错
strangObj = 2;

当程序退出声明该变量的语句块的时候,变量将失效

//声明了全局变量interger,该变量将会在程序运行时一直存在
int interger;
//声明了局部变量text,该变量将会在函数执行完毕后失效
void doSomething()
{
    string text;
}
//声明了类成员position,该变量将会在类实例销毁时失效
class Object
{
    Vector position;
}

声明的变量没有赋予初始值的时候将会发生一下情况

//原始类型变量将会有随机的值,该值取决于所申请的堆栈
//若为新开堆栈,一般该值为0或空白
int number;//为0
string text;//为""
//对象将调用其默认的构造函数为其赋初始值
//当对象类型不存在默认的构造函数时,必须显式为其赋上初始值
//详见对象一章
Object obj;//为Object()
//句柄将会默认指向空白对象
Object@ objHandle;//为null

表达式语句

//变量赋值
a = b;
//函数调用
func();

任何表达式都可以作为语句单独放置与一行

通常将作为不返回任何值(或返回值可隐式放弃)的变量分配或函数调用

表达式必须以;结尾,这也是解释器判断表达式的依据

详见AngelScript表达式


条件表达式

条件判断结构

条件判断结构表达式一般以if-else和语句块组成

通过判断条件是否满足来选择执行不同的语句块

可以连接多个if-else语句,来进行多种条件顺序选择

if(condition)
{
    //condition为真,则执行该语句块
}
else if(num < 10)
{
    //否则若Num小于10则执行该语句块
}
else
{
    //若所有条件均不满足则执行该语句块
}

选择结构

如果条件是由一个整数(无符号或有符号)控制的,那么最优解应该是使用选择结构,而不是使用多个条件判断结构串联

选择结构以switch-case和语句块组成,通过判断整数值来直接执行相应的语句块,效率比顺序依次判断的if-else结构快的多

switch(interger)
{
    case 0:
        //如果interger等于0,则执行该语句块
        break;
    //case 1后没有break打断其执行,将会继续执行下一个case的内容
    case 1:
    case constant_value:
        //如果interger等于1或者constant_value,则执行该语句块
        break;
    default:
        //如果inter不等于上述任何数,将执行该语句块
        break;
}

case的值可以是任何常量,可变量无法作为case的值

除非你希望代码继续执行下一个case的内容,否则每个case的语句块都应该以break语句终止


循环

AngelScript循环有while do-while for三种不同的类型

while循环

while循环是在执行循环之前进行条件检查的循环

//循环,在执行之前检查是否满足条件
int i = 0;
while(i =< 1)
{
    i++;
}

do-while循环

do-while循环是在执行循环之后进行条件检查的循环

//循环,在执行之后检查是否满足条件
int i = 0;
do
{
    i++;
}while(i =< 1)

for循环

for循环本质上是while循环,不过其更加紧凑,for循环在执行之前检查条件

array<array<int>> list;
//for循环可在循环结构中声明仅在循环结构体内有效的变量,并声明每次循环结束后执行的增量表达式
//声明;条件判断语句;每次循环结束后执行的增量表达式;
for(int i = 0; i <= 1; i++)
{
    list[i] = {};
}
//循环外变量将失效
i = 2;

//for循环中可以声明多个变量,以,分隔
//同样的,可以以,分割多个增量表达式
for(int i = 0, j = 0; i < 10; i++, j++)
{
    list[i][j] = 0;
}

循环控制

当循环条件过于复杂或其他原因无法使用true false表示或需要外部灵活的控制循环时,便需要循环控制语句

中断

中断循环以关键词break表示

//无限循环
for(;;)
{
    if(condition)
        break;//中断循环
}

继续

跳过接下来的语句直接进入下一轮循环,使用continue关键词表示

int i = 0;
while(i < 10)
{
    i++;
    if(i == 5)
        continue;
    print(i);
}
//结果为 1 2 3 4 6 7 8 9

返回语句

void缺省类的函数外,其他类型的函数必须以return 同类型数值的语句结束

void缺省类可以以return而不带任何返回值提前结束函数

//返回浮点值的函数pi()
float pi()
{
    return 3.1415926f;
}

void Func()
{
    //满足条件提前结束函数
    if(condition)
        return;
}

语句块

语句块是语句的结合

每个语句块将会有自己的作用域,因此在语句块内声明的变量在该块外不可见

{
    int a;
    float b;
    {
        //覆盖了语句块外的变量声明,该语句块内a为浮点数
        float a;
        //外部块中为覆盖的变量依然可见
        b = a;
        //语句块内声明的变量仅在块内可见,语句块结束后变量将被释放
        string c;
    }
    //现在a将恢复引用原先的int类型
    typeof(a);
    //c不可见,为空报错
    typeof(c);
}

尝试-捕获块

如果正在执行一些可能引发异常的不可靠的代码,并且想要捕获该异常并继续执行脚本而不是中止脚本,那么应该使用try-catch结构的语句块

{
    try
    {
        DoSomeThingThrowException();
        //如果没有引发异常则跳过catch
    }
    catch
    {
        //引发了异常将执行该语句块
    }
}

异常可能是由多种原因引发的,常见的有使用了指向null的句柄,除数为0或注册失效等引发的异常

某些情况下脚本也会故意抛出异常以中断某些执行

详细请看标准运行库异常一节

Categories: 教程合集

Dr.Abc

I ❤ Owl

订阅
提醒
guest

2 评论
最新
最旧 得票最多
Inline Feedbacks
View all comments
wolf109909
wolf109909
2023年9月18日 上午10:53

指针是@的话能不能#define * @ 然后当C++ 来写

eebssk1
管理员
2021年9月20日 下午7:53

UCG UCG AUG AUC GUG CCG ACA AUG CCG GUC GUC ACG UCU CCU CCG AAC UCG GCU AUG UUG AUG UAU AUG CCA AUG CCA UCC GUU UCU GUA GUC ACC GUG GAG ACU GUA AUG ACA CCG AAC CCU CCG GUU GCU AUG AUU AUG GUU UCU AUC AUC UGU AUG GUU ACU ACA GUA AAA CCC GAC UCU AUG UCG UUU GUG UCU GUA GAU UCG AUG AUC UGC CCU CUG CCC CCC CCA GAG CCU UGU CCC GAU ACG AUC CCA ACG AUG GAC

2
0
Would love your thoughts, please comment.x