chr*_*ton 2 vb.net conditional logical-operators
我正在使用用VB编写的遗留代码库,遇到了一个我不理解的条件运算符,无法弄清楚要搜索什么来解决它.
我正在处理的是以下代码和结果为true的变量.我不了解的具体部分是(1)第一X和第一个parens 之间的关系(-2和(2)X < 2
X是低于-2它的值,则评估为false.X是高于2它的值,则评估为true.Y低于5它,则评估true为预期.X = 3
Y = 10
If X > (-2 And X < 2) Or Y < 5 Then
'True
Else
'False
End If
Run Code Online (Sandbox Code Playgroud)
我要把Or Y < 5这篇文章的表达部分留作无趣的,并将自己限制X > (-2 And X < 2)在表达的一边.
在过去几年里我没有做过多少VB,所以我开始在VB中挖掘运算符优先级规则,以确保我有正确的事情.我找到了关于VBA和VB.Net的确切信息,以及一些可能是VB6的MSDN内容,但也可能是VB.Net的2013版本.但是,所有这些都使得<和>比较运算符的优先级高于And运算符,无论您是将其And视为逻辑还是按位.
有了这些信息,并且知道我们必须首先查看括号内部,我现在确信要评估的表达式的第一部分是X < 2(而不是-2 And X).此外,我们知道这会产生一个布尔结果,而这个布尔结果必须再转换为整数做一个按位(不是逻辑的) And用-2.那个结果(我称之为n),它仍然是一个整数,最后可以比较,看看是否X > n会产生表达式的最终结果为布尔值.
我做了一些挖掘,发现这个Stack Overflow关于将VB Booleans转换为Integers的答案.虽然不是明确的文档,但我曾有幸与作者见面(Hi @JaredPar)并且知道他在微软的VB编译团队工作,所以他应该知道他在说什么.它表明VB布尔值True具有令人惊讶-1的整数值!False变得更正常了0.
在这一点上,我们需要讨论负数的二进制表示.使用这个参考作为指南(我隐约记得在大学里学习这个,但这不是我每天都需要的那种东西),我将提供一个想象中从-3到+3的整数的转换表整数大小只有4位(短版本:反转位模式并添加一个以获得负数表示):
-3 1101 -2 1110 -1 1111 --this helps explain **why** -1 was used for True 0 0000 1 0001 2 0010 3 0010
退一步,我们现在考虑的原-2 And X < 2括号,并查看结果与真实(-1)和False(0),可能的结果X < 2按位后And有-2:
-2 (1110) And True (1111) = 1110 = -2 -2 (1110) And False (0000) = 0000 = 0
所以,如果X < 2你得到True,结果-2; 否则你最终会得到0.这里有一点值得注意的是,如果我们的语言使用的是正面的True,那么你最终会得到相同的0000值And,-2并且从False(1110 And 0001)获得.
现在我们已经足够了解一些值X并确定整个原始表达式的结果.任何正整数比两者更大-2和0,所以表达式应导致True.零和-1是相似的:它们小于2,因此将再次比较大于-2,因此总是导致True.但是,负二,应该是False.
不幸的是,这意味着您可以将整个表达式简化为X > -2.无论是我错了,运算符优先级,我为负整数位模式引用是错误的,您使用的版本是VB的转换True比其他的东西-1,或者该代码只是方式从一开始就过于复杂.