运算符:常规
编辑运算符:常规编辑
优先级编辑
使用 优先级运算符 '()'
来保证表达式求值的顺序。由优先级运算符封装(括在括号中)的表达式会覆盖运算符之间现有的优先级关系,并按照从内到外的顺序在其他表达式之前求值。
语法
precedence: '(' expression ')';
示例
函数调用编辑
使用 函数调用运算符 ()
来调用现有函数。函数调用 在脚本中定义。
语法
function_call: ID '(' ( expression (',' expression)* )? ')'';
示例
条件运算符编辑
条件运算符由三个表达式组成。第一个表达式进行求值,预期结果类型为布尔值。如果第一个表达式求值为 true,则将对第二个表达式进行求值。如果第一个表达式求值为 false,则将对第三个表达式进行求值。如果求值结果的类型不同,则第二个和第三个表达式将被提升。使用 条件运算符 '? :'
作为快捷方式,以避免在某些表达式中需要完整的 if/else 分支。
错误
- 如果第一个表达式求值结果不是布尔类型值。
- 如果第二个和第三个表达式的值无法提升。
语法
conditional: expression '?' expression ':' expression;
提升
byte |
short |
char |
int |
long |
float |
double |
引用 |
def |
|
byte |
int |
int |
int |
int |
long |
float |
double |
- |
def |
short |
int |
int |
int |
int |
long |
float |
double |
- |
def |
char |
int |
int |
int |
int |
long |
float |
double |
- |
def |
int |
int |
int |
int |
int |
long |
float |
double |
- |
def |
long |
long |
long |
long |
long |
long |
float |
double |
- |
def |
float |
float |
float |
float |
float |
float |
float |
double |
- |
def |
double |
double |
double |
double |
double |
double |
double |
double |
- |
def |
引用 |
- |
- |
- |
- |
- |
- |
- |
Object @ |
def |
def |
def |
def |
def |
def |
def |
def |
def |
def |
def |
@ 如果两个引用类型的值相同,则不会发生此提升。
示例
-
条件运算符的求值。
boolean b = true; int x = b ? 1 : 2; List y = x > 1 ? new ArrayList() : null; def z = x < 2 ? x : 2.0;
声明
boolean b
;将boolean true
存储到b
中声明
int x
;从b
加载 →boolean true
求值第一个表达式:int 1
→int 1
;将int 1
存储到x
中声明
List y
;从x
加载 →int 1
;int 1
大于int 1
→boolean false
;求值第二个表达式:null
→null
;将null
存储到y
中;声明
def z
;从x
加载 →int 1
;int 1
小于int 2
→boolean true
;求值第一个表达式:从x
加载 →int 1
;提升int 1
和double 2.0
:结果double
;隐式强制转换int 1
为double 1.0
→double 1.0
;隐式强制转换double 1.0
为def
→def
;将def
存储到z
中;
赋值编辑
使用 赋值运算符 '='
将值存储在变量或引用类型成员字段中,以便在后续操作中使用。任何产生值的运算都可以赋值给任何变量/字段,只要类型相同,或者结果类型可以隐式强制转换为变量/字段类型。
有关使用变量的示例,请参阅变量赋值。
错误
- 如果值的类型无法匹配变量或字段的类型。
语法
assignment: field '=' expression
示例
这些示例使用以下引用类型定义
name: Example non-static member fields: * int x * def y * List z
-
不同类型值的字段赋值。
声明
Example example
;分配Example
实例 →Example 引用
;将Example 引用
存储到example
中从
example
加载 →Example 引用
;将int 1
存储到Example 引用
的x
中从
example
加载 →Example 引用
;隐式强制转换double 2.0
为def
→def
;将def
存储到Example 引用
的y
中从
example
加载 →Example 引用
;分配ArrayList
实例 →ArrayList 引用
;隐式强制转换ArrayList 引用
为List 引用
→List 引用
;将List 引用
存储到Example 引用
的z
中 -
字段访问的字段赋值。
声明
Example example
;分配Example
实例 →Example 引用
;将Example 引用
存储到example
中从
example
加载 →Example 引用
;将int 1
存储到Example 引用
的x
中从
example
加载 →Example 引用 @0
;从example
加载 →Example 引用 @1
;从Example 引用 @1
的x
加载 →int 1
;隐式强制转换int 1
为def
→def
;将def
存储到Example 引用 @0
的y
中;(注意Example 引用 @0
和Example 引用 @1
相同)
复合赋值编辑
使用 复合赋值运算符 '$='
作为赋值的快捷方式,其中二元运算将在作为左侧表达式的变量/字段和单独的右侧表达式之间发生。
复合赋值等效于以下表达式,其中 V 是变量/字段,T 是变量/成员的类型。
V = (T)(V op expression);
运算符
下表显示了可用于复合赋值的运算符。每个运算符都遵循其常规定义的强制转换/提升规则。对于数值运算,必要时会进行额外的隐式强制转换,以将提升的数值类型值返回到变量/字段的原始数值类型值,这可能会导致数据丢失。
运算符 |
复合符号 |
乘法 |
*= |
除法 |
/= |
取余 |
%= |
加法 |
+= |
减法 |
-= |
左移 |
<<= |
右移 |
>>= |
无符号右移 |
>>>= |
按位与 |
&= |
布尔与 |
&= |
按位异或 |
^= |
布尔异或 |
^= |
按位或 |
|= |
布尔或 |
|= |
字符串连接 |
+= |
错误
- 如果值的类型无法匹配变量或字段的类型。
语法
compound_assignment: ( ID | field ) '$=' expression;
注意,使用 $=
表示使用任何可能的二元运算符。
示例
-
每个数值运算符的复合赋值。
int i = 10; i *= 2; i /= 5; i %= 3; i += 5; i -= 5; i <<= 2; i >>= 1; i >>>= 1; i &= 15; i ^= 12; i |= 2;
声明
int i
;将int 10
存储到i
中从
i
加载 →int 10
;将int 10
和int 2
相乘 →int 20
;将int 20
存储到i
中;(注意,这等效于i = i*2
)从
i
加载 →int 20
;将int 20
除以int 5
→int 4
;将int 4
存储到i
中;(注意,这等效于i = i/5
)从
i
加载 →int 4
;int 4
除以int 3
的余数 →int 1
;将int 1
存储到i
中;(注意,这等效于i = i%3
)从
i
加载 →int 1
;将int 1
和int 5
相加 →int 6
;将int 6
存储到i
中;(注意,这等效于i = i+5
)从
i
加载 →int 6
;从int 6
中减去int 5
→int 1
;将int 1
存储到i
中;(注意,这等效于i = i-5
)从
i
加载 →int 1
;将int 1
左移int 2
位 →int 4
;将int 4
存储到i
中;(注意,这等效于i = i<<2
)从
i
加载 →int 4
;将int 4
右移int 1
位 →int 2
;将int 2
存储到i
中;(注意,这等效于i = i>>1
)从
i
加载 →int 2
;将int 2
无符号右移int 1
位 →int 1
;将int 1
存储到i
中;(注意,这等效于i = i>>>1
)从
i
加载 →int 1
;int 1
和int 15
按位与 →int 1
;将int 1
存储到i
中;(注意,这等效于i = i&2
)从
i
加载 →int 1
;int 1
和int 12
进行按位异或运算 →int 13
;将int 13
存储到i
中;(请注意,这等效于i = i^2
)从
i
加载 →int 13
;int 13
和int 2
进行按位或运算 →int 15
;将int 15
存储到i
中;(请注意,这等效于i = i|2
) -
每个布尔运算符的复合赋值。
声明
boolean b
;将boolean true
存储在b
中;从
b
加载 →boolean true
;boolean true
和boolean false
进行布尔与运算 →boolean false
;将boolean false
存储到b
中;(请注意,这等效于b = b && false
)从
b
加载 →boolean false
;boolean false
和boolean false
进行布尔异或运算 →boolean false
;将boolean false
存储到b
中;(请注意,这等效于b = b ^ false
)从
b
加载 →boolean true
;boolean false
和boolean true
进行布尔或运算 →boolean true
;将boolean true
存储到b
中;(请注意,这等效于b = b || true
) -
使用字符串连接运算符进行复合赋值。
-
使用
def
类型的复合赋值。 -
带有额外隐式转换的复合赋值。