计算表达式 1 <= month <= 12

Evaluating the expression 1 <= month <= 12

我正在尝试在 if 条件下计算表达式 (1 <= month <= 12)

此语句在 java 脚本中似乎有效,但在 Java.

中无效

在Java,

int month = 0;
boolean flag = (1 <= month <= 12);

它抛出以下错误:

The operator <= is undefined for the argument type(s) boolean, int

在Java脚本中,

var month = 0;
console.log('Expression evaluates to: ', (1 <= month <= 12));

It always returns true no matter what the value of month is.

谁能解释一下:

我也知道我可以让它以这种方式工作 (1 <= month && month <= 12)。所以,不是在寻找解决方案,而是在寻找解释。

谢谢。如果我的问题不清楚,也请告诉我。

<=是非关联的,所以不能重复使用。您可以指定它:

1 <= month && month <= 12

原因是Java脚本解析器1 <= month <= 12解析为:

(1 <= month) <= 12

这是 JavaScript 语法的结果,他们本可以用其他方式定义它,但这会使事情变得有点复杂。大多数语法将表达式定义为:

expr -> [0-9]+
expr -> identifier
expr -> expr '<=' expr

(使用 LALR)解析器。

Java使用以下(近似)语法:

expr -> numExpr '<=' numExpr
expr -> numExpr
numExpr -> identifier
numExpr -> [0-9]+
(...and so on...)

在 Java 中,因此甚至不可能解析这样的表达式(除非您执行强制转换使其再次成为 numExp)。


对于Java脚本部分,为什么总是return true

现在 (1 <= month) 是一个布尔值(true/1 或 false/0),并且该值无法(合理地)与 1201 总是小于或等于 12)。只有非常有限的编程语言支持此功能。

关于子问题

Why does java consider it as an invalid expression?

因为Java是这样计算的:

(1 <= month) <= 12
 boolean     <= int

由于类型安全,不能比较布尔值和整数。

原因是由于short-circuit evaluation(这是大多数编程语言用来评估逻辑表达式的方法)。本质上发生的是表达式从左到右求值并沿途转换所以...

1 <= month <= 12

被评估为:

(1 <= month) <= 12

哪个给你:

true <= 12
/* or */
false <= 12

如您所见,在 Java 中(因为它是类型安全的)您会遇到类型错误。因为您不能对布尔值使用 <= 运算符。在 JS 中,布尔值总是 <= 到一个数字(你可以在你的控制台中测试)。

希望这能回答您的问题!