计算表达式 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.
谁能解释一下:
- 表达式是否有效?
- 为什么在 java 脚本中总是屈服于
true
?
- 为什么 java 将其视为无效表达式?
我也知道我可以让它以这种方式工作 (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
),并且该值无法(合理地)与 12
(0
和 1
总是小于或等于 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 中,布尔值总是 <=
到一个数字(你可以在你的控制台中测试)。
希望这能回答您的问题!
我正在尝试在 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.
谁能解释一下:
- 表达式是否有效?
- 为什么在 java 脚本中总是屈服于
true
? - 为什么 java 将其视为无效表达式?
我也知道我可以让它以这种方式工作 (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
),并且该值无法(合理地)与 12
(0
和 1
总是小于或等于 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 中,布尔值总是 <=
到一个数字(你可以在你的控制台中测试)。
希望这能回答您的问题!