评估表达式1 <=月&lt; = 12

时间:2015-04-02 14:25:38

标签: java javascript expression

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

此声明在javascript中似乎有效,但在Java中则无效。

在Java中,

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

它抛出以下错误:

  

对于参数类型boolean,int

,运算符&lt; =未定义

在Javascript中,

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

无论月份的价值是多少,它总会返回true

有人可以解释一下:

  • 如果是有效表达式?
  • 为什么它总是在javascript中屈服于true
  • 为什么java会将其视为无效表达式?

此外,我知道我可以通过这种方式使用(1 <= month && month <= 12)。所以,不是寻找解决方案而是寻求解释。

感谢。如果我的问题不明确,也请告诉我。

3 个答案:

答案 0 :(得分:10)

<=是非关联的,因此您无法通过重复使用它。您可以使用以下命令指定它:

1 <= month && month <= 12

原因是 JavaScript解析器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的强制转换)。


对于JavaScript部分,为什么总是返回true

现在(1 <= month)是一个布尔值(true / 1或false / 0),并且该值无法与120进行比较(合理) }和1始终小于或等于12)。只有非常有限的编程语言才支持这种功能。

答案 1 :(得分:3)

关于子问题

  

为什么java会将其视为无效表达式?

这是因为Java通过以下方式对其进行评估:

(1 <= month) <= 12
 boolean     <= int
由于类型安全,无法比较布尔值和整数。

答案 2 :(得分:3)

原因是short-circuit evaluation(这是大多数编程语言用来评估逻辑表达式的方法)。基本上发生的事情是表达式从左到右进行评估,并在此过程中进行转换......

1 <= month <= 12

获得评估为:

(1 <= month) <= 12

哪个可以给你:

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

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

希望能回答你的问题!