ECMAScript 和 C/Java 之间 ConditionalExpression 的语法差异
Grammar difference of ConditionalExpression between ECMAScript and C/Java
引自ECMAScript Language Specification
The grammar for a ConditionalExpression in ECMAScript is a little bit different from that in C and Java, which each allow the second subexpression to be an Expression but restrict the third expression to be a ConditionalExpression. The motivation for this difference in ECMAScript is to allow an assignment expression to be governed by either arm of a conditional and to eliminate the confusing and fairly useless case of a comma expression as the centre expression.
有人可以使用示例更详细地解释差异吗?
useless case of a comma expression as the centre expression
是什么意思?为什么 C/Java 中的条件表达式不是 allow an assignment expression to be governed by either arm of a conditional
?
在Java脚本中,您可以这样做:
foo(condition ? a = 1 : b = 2);
(你是否应该是另一回事,但你可以。)
...结果将是评估条件,a
被分配 1
或 b
被分配 2
,然后 foo
用 1
或 2
调用。
你不能在 Java 中这样做(我不能和 C 说话,已经 ~25 年了),因为它不允许你在第三个操作数中放置赋值表达式。奇怪的是,它允许你在第二个操作数中放置一个赋值表达式,所以你可以这样做:
foo(condition ? a = 1 : 2);
...即使在 Java.
返回 Java脚本:如果不允许您这样做
foo(condition ? a = 1 : b = 2);
...出于与 Java 相同的原因,您可以通过这样做来解决它:
foo(condition ? a = 1 : (b = 2, b));
// ---------------------^-----^^^^
...因为 Java 脚本有 逗号运算符 计算其操作数,然后将 right-hand 操作数的结果作为其值。逗号表达式 (b = 2, b
) 不是赋值表达式,因此它可以解决在条件运算符的第三个操作数中不允许赋值表达式的限制(即使输入逗号表达式的表达式之一 b = 2
, 是赋值表达式).
因此,即使在第三个操作数中也允许赋值表达式,Java脚本避免了在那里无意义地使用逗号表达式。
引自ECMAScript Language Specification
The grammar for a ConditionalExpression in ECMAScript is a little bit different from that in C and Java, which each allow the second subexpression to be an Expression but restrict the third expression to be a ConditionalExpression. The motivation for this difference in ECMAScript is to allow an assignment expression to be governed by either arm of a conditional and to eliminate the confusing and fairly useless case of a comma expression as the centre expression.
有人可以使用示例更详细地解释差异吗?
useless case of a comma expression as the centre expression
是什么意思?为什么 C/Java 中的条件表达式不是 allow an assignment expression to be governed by either arm of a conditional
?
在Java脚本中,您可以这样做:
foo(condition ? a = 1 : b = 2);
(你是否应该是另一回事,但你可以。)
...结果将是评估条件,a
被分配 1
或 b
被分配 2
,然后 foo
用 1
或 2
调用。
你不能在 Java 中这样做(我不能和 C 说话,已经 ~25 年了),因为它不允许你在第三个操作数中放置赋值表达式。奇怪的是,它允许你在第二个操作数中放置一个赋值表达式,所以你可以这样做:
foo(condition ? a = 1 : 2);
...即使在 Java.
返回 Java脚本:如果不允许您这样做
foo(condition ? a = 1 : b = 2);
...出于与 Java 相同的原因,您可以通过这样做来解决它:
foo(condition ? a = 1 : (b = 2, b));
// ---------------------^-----^^^^
...因为 Java 脚本有 逗号运算符 计算其操作数,然后将 right-hand 操作数的结果作为其值。逗号表达式 (b = 2, b
) 不是赋值表达式,因此它可以解决在条件运算符的第三个操作数中不允许赋值表达式的限制(即使输入逗号表达式的表达式之一 b = 2
, 是赋值表达式).
因此,即使在第三个操作数中也允许赋值表达式,Java脚本避免了在那里无意义地使用逗号表达式。