我正在使用用VB编写的遗留代码库,遇到了一个我不理解的条件运算符,无法弄清楚要搜索什么来解决它。
我正在处理的是以下代码和结果为true的变量。我不理解的具体部分是(1)第一个(-2
和第一个parens X < 2
之间的关系,以及(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
。l = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]]
答案 0 :(得分:5)
我要将这篇文章的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
,它将表达式的最终结果作为布尔值。
我做了一些挖掘,发现this Stack Overflow answer关于将VB Booleans转换为Integers。虽然不是明确的文档,但我曾有幸与作者见面(Hi @JaredPar)并且知道他在微软的VB编译团队工作,所以他应该知道他在说什么。它表明VB布尔True
具有令人惊讶的-1
值作为整数! False
变得更加正常0
。
此时我们需要讨论负数的二进制表示。使用this reference作为指导(我隐约记得在大学里学习这个,但这不是我每天都需要的东西),我将提供一个从-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
括号,然后在按位X < 2
之后查看And
的真(-1)和假(0)可能结果的结果与-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
,因此表达式应为True
。零和-1是相似的:它们小于2,因此只会再次比较大于-2,因此总是导致False
。但是,否定的两个,以及任何低于,应该是X > -2
。
不幸的是,这意味着您可以将整个表达式简化为True
。我对运算符优先级的错误,我对负整数位模式的引用是错误的,你使用的是将-1
转换为transform: translateX(-yourPercent%);
以外的其他东西的VB版本,或者此代码只是<从一开始,em> 方式 过于复杂。
答案 1 :(得分:1)
我相信顺序如下:
r = -2 和 X '输出 X,最低有效位设置为 0(表示第一个较小的偶数)
r = (r < 2) '输出 -1 或 0
r = (X > r) '输出 -1 或 0
r = r 或 (Y < 5)
使用 AndAlso 和 OrElse。