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

说点什么

avatar
  订阅  
提醒