这是一些“坏”代码:
Module test
Sub Main()
Console.WriteLine("1<2 = " + cstr((1<2)))
Console.WriteLine("2<1 = " + cstr((2<1)))
Console.WriteLine("1<2<3 = " + cstr((1<2<3)))
Console.WriteLine("3<2<1 = " + cstr((3<2<1)))
End Sub
End Module
这个输出是:
1<2 = True
2<1 = False
1<2<3 = True
3<2<1 = True
1<2<3
是正确的,但不是出于正确的原因。
3<2<1
也评估为True。为什么呢?
有人可以解释这里发生了什么吗?
我知道我应该使用a<b and b<c
,但我想知道使用连续运算符时会发生什么。即,为什么编译器不哭!像这样的语法用于别的吗?
答案 0 :(得分:9)
它从左到右进行评估,因此3<2<1
与(3<2)<1
相同。因为括号中的表达式为false,所以整个事物的计算结果为0<1
,这是真的。
答案 1 :(得分:3)
首先,使用Option Strict On,编译器确实会哭。使用Option Strict Off,会发生以下情况:
3 < 2 < 1
从左到右进行评估,因此相当于(3 < 2) < 1
3 < 2
被评估为False
,因此编译器评估:False < 1
False
转换为0
,以便可以将其与另一个int值进行比较0 < 1
评估为True
答案 2 :(得分:1)
它并非特定于任何语言,但a<b<c
将始终评估为(a<b) < c
。这适用于所有其他运营商。因此,a+b+c
始终为(a+b) + c
。