左关联操作的强制顺序优先级很容易实现:10 - 5 + 3
与10 - (5 + 3)
但是,我想知道是否有一种方法可以对像右相关的运算符强制这种优先级?我很难弄清楚。例如,如果我使用Java,是否可以强制使用++
或=
运算符之类的优先级?
通常,更改右联想算子的评估顺序与左联想算子的方法相同。
[具有a × b × c
形式的表达式时,可以通过指定(a × b) × c
或a × (b × c)
来确定评估顺序,而不管哪个是默认值。 JLS, §15.7.3状态:
Java编程语言遵守由括号显式表示的评估顺序,并由运算符优先级隐式表示。
但是,赋值的结果是一个值,并且赋值运算符的左边不允许有该值,因此(a = b) = c
始终无效。这与C ++等编程语言不同,在C ++中,表达式¹可以求值为可分配的引用。
如this answer中所述,优先级由Java编程语言的语法隐式给出。由于赋值运算符的语法已被定义为不允许在运算符的左侧使用任意表达式,特别是在此位置不支持大括号表达式,因此已经可以尝试分配给大括号赋值被解析器拒绝²。
请注意,a -> b -> c
是右关联的,但不能更改,因为(a -> b) -> c
不是有效的表达式,因为->
左侧唯一有效的内容是参数列表。
Java中唯一有意义的更改顺序的表达式是三级运算符,因为a? b: c? d: e
的求值为a? b: (c? d: e)
,但是可以更改为(a? b: c)? d: e
,如果[ C0]和b
评估为c
结果。
对于一元运算符的组合,您不能通过插入括号来更改评估顺序。如果您具有boolean
形式的表达式,但想要op1 op2 value
,则只需使用后者。例如,另一件事是op2 op1 value
,- a - b
和(- a) - b
的含义不同,但这是涉及二进制运算符的另一种情况。
¹,但以变量名或数组索引结尾的变量除外²至少应该如此。我只是注意到ecj和javac都与规范相矛盾,并且只有在解析后才拒绝它]