【问题标题】:Evaluating the expression 1 <= month <= 12评估表达式 1 <= month <= 12
【发布时间】:2015-04-02 22:48:42
【问题描述】:

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

此语句在 javascript 中似乎有效,但在 Java 中无效。

在 Java 中,

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

它会抛出以下错误:

操作符

在 Javascript 中,

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

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

谁能解释一下:

  • 是否为有效表达式?
  • 为什么在 javascript 中它总是屈服于true
  • 为什么java会认为它是一个无效的表达式?

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

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

【问题讨论】:

  • 这是一个有效的表达式(在 JavaScript 中,而不是在 Java 中),但它并没有像您认为的那样做。 Java 不会让您在数字和布尔值之间执行类似的比较,但它会以相同的方式解析表达式 ((1 &lt;= month) &lt;= 12)。
  • 不要比较 Javascript 和 Java。没有出于相同的目的。 Java 是强类型的,而 javascript 不是并且将允许更多 funky 风格的编程

标签: java javascript expression


【解决方案1】:

&lt;= 是非关联的,所以你不能通过重复使用它。你可以指定它:

1 <= month && month <= 12

原因是JavaScript解析器1 &lt;= month &lt;= 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 &lt;= month) 是一个布尔值(true/1 或 false/0),并且该值无法与 12 进行比较(合理)(01 始终小于或等于12)。只有非常有限的编程语言支持这种功能。

【讨论】:

  • "并且该值无法与 12" 进行比较(合理)当然可以。它被强制转换为一个数字。
  • @squint:是的,但在这种情况下,它没有任何意义。从数学上讲,a 意味着 bac 之间夹在
  • @squint:确实。他们不应该在 Java 之后命名 JavaScript,他们没有太多共同点。 Java 是强类型的,而 JavaScript 是动态类型的。
  • 我同意。坦率地说,我认为原来的 LiveScript 名称更好,而且更容易混淆!
  • @iaL:使用一种语言的经验作为理解或比较另一种语言的基础是可以理解的,只要人们意识到不应该期待相似性。因此,诸如“为什么语言 A 认为这是有效的而语言 B 不认为有效” 之类的问题将始终归结为 “因为它们是不同的语言”。 ;-)
【解决方案2】:

关于子问题

为什么java会认为它是一个无效的表达式?

这是因为 Java 用以下方式评估它:

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

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

【讨论】:

    【解决方案3】:

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

    1 <= month <= 12
    

    被评估为:

    (1 <= month) <= 12
    

    哪个给你:

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

    如您所见,在 Java 中(因为它是类型安全的)您会收到类型错误。因为您不能在布尔值上使用 &lt;= 运算符。在 JS 中,布尔值始终是 &lt;= 到一个数字(您可以在控制台中对此进行测试)。

    希望能回答您的问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多