我在jsfiddle.net上玩耍,想知道为什么这会返回true?
if(0 < 5 < 3) {
alert("True");
}
那么这个也是一样的:
if(0 < 5 < 2) {
alert("True");
}
但这个不行:
if(0 < 5 < 1) {
alert("True");
}
这种怪癖有用处吗?
我在jsfiddle.net上玩耍,想知道为什么这会返回true?
if(0 < 5 < 3) {
alert("True");
}
那么这个也是一样的:
if(0 < 5 < 2) {
alert("True");
}
但这个不行:
if(0 < 5 < 1) {
alert("True");
}
这种怪癖有用处吗?
计算顺序导致在javascript中将(0 < 5 < 3)
解释为((0 < 5) < 3)
,产生(true < 3)
,而true被计算为1,导致它返回true。
这也是为什么(0 < 5 < 1)
返回false,(0 < 5)
返回true,它被解释为1
,导致(1 < 1)
。
if(0 < 5 < 1) == false
的时候回答了。现在一切都清楚了,谢谢 :) - punkrockbuddyholly((0 < 5) && (5 < 3))
的语言,可能还有其他语言也是如此,但我不知道。 - Alan Geleynse我猜是因为0 < 5
是正确的,而true < 3
被转换为1 < 3
,其结果也是正确的。
可能是因为假设true
为1
0 < 5 < 3 --> true < 3 --> 1 < 3 --> true
因为 true < 3
,因为 true == 1
关于你的问题,这种怪异行为是否有用:我想可能会有一些情况下它是有用的(如果紧凑的代码是你追求的目标的话),但过分依赖它很可能会严重降低你的代码可读性。
这就像在更大的表达式中使用后置/前置递增/递减一样。你能一眼判断出这段代码的结果吗?
int x = 5;
int result = ++x + x++ + --x;
注意:使用这段代码,有时根据语言和编译器的不同,您甚至可以获得不同的结果。
为了使自己和下一个人更容易阅读代码,最好清晰地写出您实际想要发生的事情,而不是依赖于布尔值的隐式转换等副作用,从而使生活变得轻松愉快。
result
是18吗? - punkrockbuddyholly+/A>100
如果A是一个包含5个元素的数组,元素分别为107、22、256、110和3,则:
A>100
+/1 0 1 1 0
3
这个问题是一个完美的例子,展示了这种技巧非常有用的地方,特别是当问题被概括为确定n个布尔值中至少有m个为真时。 检查至少有两个布尔值为真的方法。(0 < 5 < 3)
从左到右开始,因此它首先评估第一个0 < 5。它是真的吗?是的。由于TRUE=1,它评估1 < 3。由于1小于3,因此它是真的。
现在来看这个:
(0 < 5 < 1)
0是否小于5?是的。所以把它变成TRUE,这也意味着1。现在有了这个事实,它被评估为(1 < 1)。1是否小于1?不是,因此它是假的。它必须相等。
我之前在 Obj-C 中遇到了这个问题,感到非常困惑。通过类似以下的方式,我得到了期望的结果:
if(0 < 5 && 5 < 3) {
alert("True");}
这是在判断0<5,由于1<3也为真,因此返回1表示真。
C#不允许您这样做:“运算符'<'不能应用于类型为'bool'和'int'的操作数”。
3 < x < 10
将在vanilla JS中转换为(3 < x && x < 10)
。