强制顺序优先(右结合)
Forcing order precedence (right associative)
强制左关联操作的顺序优先非常容易:
10 - 5 + 3
对比 10 - (5 + 3)
但是,我想知道是否有一种方法可以像这样用右结合运算符强制优先级?我很难弄清楚。
例如,如果我在 Java 中工作,我可以强制使用 ++
或 =
运算符之类的优先级吗?
通常,更改右结合运算符的计算顺序与左结合运算符的工作方式相同。
当您有 a × b × c
形式的表达式时,您可以通过指定 (a × b) × c
或 a × (b × c)
来确定求值顺序,而不管哪个是默认值。 JLS, §15.7.3 状态:
The Java programming language respects the order of evaluation indicated explicitly by parentheses and implicitly by operator precedence.
但是,赋值的结果是一个值,赋值运算符的左边不允许有值,所以(a = b) = c
总是无效的。这与 C++ 等编程语言不同,在 C++ 中,表达式¹ 可以计算为可分配的引用。
如 中所述,优先级由 Java 编程语言的语法隐式指定。由于赋值运算符的语法已经以不允许在运算符左侧的任意表达式的方式定义,特别是此处不支持大括号表达式,因此尝试分配给大括号赋值已经得到被解析器拒绝²。
请注意,类似地,a -> b -> c
是右结合的,但不能更改,因为 (a -> b) -> c
不是有效表达式,因为 [=16= 左侧唯一有效的表达式] 是一个参数列表。
Java 中唯一的右结合表达式,其中更改顺序是有意义的,是三级运算符,因为 a? b: c? d: e
被评估为 a? b: (c? d: e)
,但可以更改到 (a? b: c)? d: e
,如果 b
和 c
计算结果为 boolean
,这将是有效的。
对于一元运算符的组合,不能通过插入括号来改变计算顺序。如果您有 op1 op2 value
形式的表达式,但想要 op2 op1 value
代替,请使用后者。另一件事是,例如- a - b
,其中(- a) - b
和- (a - b)
有不同的含义,但这是涉及二元运算符的另一种情况。
¹ 以变量名或数组索引结尾的除外
² 至少,它应该。我只是注意到 ecj 和 javac 都与规范相矛盾,并且在解析后才拒绝它
强制左关联操作的顺序优先非常容易:
10 - 5 + 3
对比 10 - (5 + 3)
但是,我想知道是否有一种方法可以像这样用右结合运算符强制优先级?我很难弄清楚。
例如,如果我在 Java 中工作,我可以强制使用 ++
或 =
运算符之类的优先级吗?
通常,更改右结合运算符的计算顺序与左结合运算符的工作方式相同。
当您有 a × b × c
形式的表达式时,您可以通过指定 (a × b) × c
或 a × (b × c)
来确定求值顺序,而不管哪个是默认值。 JLS, §15.7.3 状态:
The Java programming language respects the order of evaluation indicated explicitly by parentheses and implicitly by operator precedence.
但是,赋值的结果是一个值,赋值运算符的左边不允许有值,所以(a = b) = c
总是无效的。这与 C++ 等编程语言不同,在 C++ 中,表达式¹ 可以计算为可分配的引用。
如
请注意,类似地,a -> b -> c
是右结合的,但不能更改,因为 (a -> b) -> c
不是有效表达式,因为 [=16= 左侧唯一有效的表达式] 是一个参数列表。
Java 中唯一的右结合表达式,其中更改顺序是有意义的,是三级运算符,因为 a? b: c? d: e
被评估为 a? b: (c? d: e)
,但可以更改到 (a? b: c)? d: e
,如果 b
和 c
计算结果为 boolean
,这将是有效的。
对于一元运算符的组合,不能通过插入括号来改变计算顺序。如果您有 op1 op2 value
形式的表达式,但想要 op2 op1 value
代替,请使用后者。另一件事是,例如- a - b
,其中(- a) - b
和- (a - b)
有不同的含义,但这是涉及二元运算符的另一种情况。
¹ 以变量名或数组索引结尾的除外
² 至少,它应该。我只是注意到 ecj 和 javac 都与规范相矛盾,并且在解析后才拒绝它