运算符:通用
编辑运算符:通用
编辑优先级
编辑使用 优先级运算符 '()'
来保证表达式的求值顺序。用优先级运算符(括号括起来)封装的表达式会覆盖运算符之间现有的优先级关系,并在其他表达式之前按照由内向外的顺序进行求值。
语法
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 |
引用 |
- |
- |
- |
- |
- |
- |
- |
对象 @ |
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
加载 →布尔值 true
;布尔值与布尔值 true
和布尔值 false
进行与运算 →布尔值 false
;将布尔值 false
存储到b
;(注意这等价于b = b && false
)从
b
加载 →布尔值 false
;布尔值与布尔值 false
和布尔值 false
进行异或运算 →布尔值 false
;将布尔值 false
存储到b
;(注意这等价于b = b ^ false
)从
b
加载 →布尔值 true
;布尔值与布尔值 false
和布尔值 true
进行或运算 →布尔值 true
;将布尔值 true
存储到b
;(注意这等价于b = b || true
) -
使用字符串连接运算符的复合赋值。
-
使用
def
类型的复合赋值。 -
带有额外隐式转换的复合赋值。