可以将int、float和vector数据类型用于逻辑算符。
每种类型的值对应于真和假。一个 int 或 float 值当它的值转换成整型时是0则被认为是假。 一个矢量的幅度值当它的值转换成整型时是0则被认为是假。转换成所有其它的值则都被认为是真。 下表显示三中逻辑算符的符号和逻辑意义: 符号 逻辑为真,如果: ││ 或 不管左边或者右边为真 && 和 左边或者右边都为真 ! 非 右边为假
if (0 ││ 1) print(\if (0 && 1) print(\if (2 && <<3, 7.7, 9>>
print(\
if (! 5.39 && 7) print(\if (<<0, 0, 0>> ││ 0) print(\if (! <<0, 0, 0>>关系运算
关系运算比较两个值。它们对int, float和vector数据类型是有效的。指令的真值取决于左边对右边值的关系。
下表列出关系运算符和条件: 符号 真,如果右边为: < 小于右边 > 大于右边 == 等于右边 != 不等于右边 >= 大于或者等于右边 <= 小于或者等于右边
if (-2.5 < 1) print(\if (16.2 > 16.2) print(\if (-11 == -11) print(\if (-11 != -11) print(\if (-11 >= -11) print(\if (1 <= 0) print(\
当一个矢量被进行<, >, > =, or < = 运算,它的幅度被用于代替矢量自己本身。矢量的幅度是浮点类型。 if (<<1, 2, 3>> < <<3, 2, 1>>if (<<1, 2, 3>> <= <<3, 2, 1>>if (<<0, 0, 4>> > <<3, 2, 1>>if (<<0, 5, 0>> <= <<-3, -4, 0>>
print(\ print(\ print(\
print(\
print(\
当用== 或者 != 运算比较两个矢量时,该矢量本身被使用。
如果一个矢量的每一个成分都与另一个矢量的对应成分相等,则这两个矢量相等。 if (<<1, 2, 3>> == <<3, 2, 1>>if (<<1.2, 2, 3>> != <<0, 0, 0>>
print(\
print(\ print(\
if (<<1, 2.2, 3>> == <<1, 2.2, 3>>
提示:注意赋值算符(=)与等价算符(==)之间的差别。有时候用一个代替另一个产生的错误是很难发现的。 例如,使用赋值算符代替等价算符产生一个值。该值可以被用作为一个逻辑真值或者一个谎言。 将这些算符进行混合并不保险,因为一个变量当它不打算赋于一个值时却可以赋于该值。
21
作为整数的比较赋值
所有的比较算符产生整数结果。尽管在同一个语句里不常将比较算符与计算相混合,但这种混合是无效的。 事实上,可以使用一个整型变量作为一个逻辑语句的一部分和保存逻辑结果。 int $sra = (4.7 == 4.7) + 5; // Assigned: 6
int $rra = <<1, 2, 3>> >= <<9, 0, 0>>; // Assigned: 0 int $rrr = 0 ││ 72.3; // Assigned: 1 int $sar = 3 * (1.2 && ! <<0, 0, 0>>
; // Assigned: 3
if ($rra ││ $rrr) print(\
逻辑算符只使用整型项工作。即使你可以比较真值,但这样做不保险。看以下例子: int $xsv = 5;
if ($xsv) print(\if (true) print(\
if ($xsv == true) print(\
变量 $xsv 因为它的值而表达了一个真值,但转换为整型并不为0。但是,有许多为0的整型值。 事实上,关true也表达了一个真值,因为它的值为1 (常数 )。然而,这些真值相互都不相等。 一个整型值为1 ,其它的整型值为5。
由于这个问题,可以不比较真值。即使这些值都是真值,它并不意味着值是相等的,正象上例所显示的那样。 5、条件
条件算符有三项。第一项是一个测试条件,它表达了是真还是假。它后跟一个问号(?),然后第二项和第三项以冒号(
分开。
如果测试条件为真,使用 ? 后面的项。反之使用 : 后面的。 以下是条件算符的格式: 测试条件 ? 语句1 : 语句2;
float $src = rand(5) < 3 ? 15 : 25;
在上例中,测试条件作为一个整型来运算。如果rand(5)返回了一个小于3的数,$src 被赋值为15;反之 $src 被赋值为25。
Maya只计算语句1或语句2,而不是两者都计算。 int $full = 23;
int $large = 1 < 2 ? ++$full : --$full; 在这个例子中,large 和 full 都被赋值为24。 float $mog = <<0, 0, 0>> ? 8 : 3.3;
因为在上述例子里Maya把8作为一个整型,所以浮点数 3.3 在被赋值给$mog之前先被转换成一个整数。它把3赋值给$mog。 6、运算序列
以下显示出了MEL中运算符优先的顺序。相同行的运算符具有相同的优先级。 如果一条指令有两个以上的相同优先级的运算符,则最左边的运算符是首先进行的。 Unary和赋值运算符是右相关的; 其它所有的都是左相关的。 int $chow = 3 + 5 * 2; // int $chow = (3 + (5 * 2)) float $blu = 5 * ++$chow; // float $blu = (5 * (++$chow)) $blu = 5 && 3 % 2 / 3; // $blu = (5 && ((3 % 2) / 3)) $blu -= $chow += ! 5 < 3; // $blu -= ($chow += ((! 5) < 3))
这些例子显示了运算优先的缺省顺序。要改变运算符优先的顺序,可以使用组运算。 7、成组运算
括号是用于成组运算的,在运算优先结构的顶部。如以下的例子所示,括号对于手动地修改运算符的赋值
22
顺序是有用的。
int $mao = (3 + 5) * 2;
float $fir = (1 + 2) * 5 * ($mao < 20); $mao /= 2 + ((($fir -= 10) == 5) < 0.5);
定义作用(1)
语句的结合形成脚本的作用。
本章有以下内容:1、了解作用和流控制;2、分组;3、条件作用;4、环。 1、了解作用和流控制
为了控制许多语句的执行顺序,使用流控制(flow control)。流控制使你可以有条件地、重复地执行MEL脚本的一节。
使你可以产生一个纯净的和简单的MEL脚本运行复杂的程序。流控制的最基本的成分是分组。 2、分组 使用分组可以:
--用一条简单的语句执行一组语句 --产生脚本的可调节性 --定义局部变量的可见性
典型地,使用分组在只允许执行一条语句的地方执行一组语句。为了不限制一组语句,使用花括号({ })。 例如, if 语句只允许执行一条语句,如果它的条件是真的话。在这条语句之后的任何语句将会被有条件地执行。
为了有条件地执行它们,需要对每一条语句加一个if 语句。这会是很没有效率和使人厌烦。 int $mok = 241; if ($mok % 3 == 0) print(\
print(\if ($mok % 3 == 0)
print(\把这个语句分成组只允许使用一条语句: int $sok = 241; if ($sok % 3 == 0)
{ print(\
一个组内的所有语句,即使只有一条,也必须用分号结束。在关闭了一个组之后不需要分号。 对围绕程序体也需要分组: proc delta()
{ print(\
分组是很少使用的,虽然它对于避免名字冲突和重新覆盖定位于组内的局部变量的存储器是很有用的。 可见性
一个组内的局部变量用在该组执行之后。它在该组已经执行并使得这些变量在组外不可见时, 重新覆盖了定位于这些局部变量之后的存储器。一个组内的局部变量只存在于这个组里。 int $real = 28;
{ float $ghost = 73.3; print($real + \
print($ghost); // ghost exists in grouping } print($real); // real exists outside of grouping print($ghost); // ERROR: ghost exists only in grouping
一个程序内的局部变量可认为是对该程序是局部的。因此,在一个程序内被声明的局部变量将只在该程序
23
内是可见的。 3、条件作用
条件语句使你仅当该测试条件为真时执行一条语句或一组语句,这个测试条件必须在括号中, 结果值应当是一个整型、浮点或者是一个矢量。该测试条件值随后被转换为一个整型数表达真或假。 如果测试条件有一个int或float类型的值,仅当该值转换成整型后不为0时,该测试条件为真。 if (0) print(\if (1) print(\if (-17.4) print(\if (0.9) print(\if (-0.7) print(\
如果测试条件有一个矢量类型的值,仅当该矢量的幅值转换成整型时不为0时,该测试条件为真。 if (<<0.9, 0.3, 0.3>>if (<<.8, 0.3, 0.7>>if (<<0, 0, 0>>if (<<0, 4, -37>>if (<<0, 1, 0>>if
if 条件语句有以下格式: if (test condition) statement;
如果测试条件为真,语句被执行。 if (9836 % 27 > 13)
print(\ if (3743 % 17 < 8)
{ print(\else
else 语句仅与if 条件语句一起工作。它有以下格式: if (test condition) statement1; else statement2;
如果测试条件为真,执行语句1;否则执行语句2。语句1和语句2可以是任何的有效语句。 if (rand(10) < 5)
print(\else
print(\if (rand(2))
print(\else
{ print(\else if
else if 语句仅与if else 条件语句一起工作。它有以下格式: if (test condition1)
print(\ print(\
print(\ print(\ print(\
测试条件可以包括任何的变量和算符(甚至赋值算符),但是结果值应该是int、 float或者vector类型。
24
statement1;
else if (test condition2) statement2;
如果测试条件为真,执行语句1。否则,如果语句2为真,执行语句2;如果没有真值,就都不执行。 语句1和语句2可以是任何的有效语句。 float $random = rand(2); if ($random < 1)
print(\else if ($random < 2) print(\else
print(\在上述的例子中,
--如果随机变量的值小于1,只显示 \。 --如果随机变量大于等于1而小于2,只显示 \。 --如果随机变量的值为2,只显示\。 rand(2) 调用极少返回一个准确为2的值。 float $crow = rand(10); if ($crow < 5)
print(\else if ($crow < 7)
{ print(\switch
一个switch语句执行一些语句的片段,取决于控制值。该控制值可以是int、 float、string或者vector数据类型。
switch体被括在括号中与一个或更多的调用情况的语句块相比较。
各个情况被case后跟一个相同类型的作为控制的值加以标号,然后是冒号。
该控制值决定了哪个执行case语句。如果一个case语句值等于控制值,该case 语句就被执行。 switch语句具有以下的总体形式: switch (control value) {
case value1: statement1; break; case value2: statement2; break; case value3: statement3; break; ... default: statement4; break;
25