在VB.NET中混淆逻辑运算符

时间:2017-09-20 19:44:18

标签: vb.net conditional logical-operators

我正在使用用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 = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]]

2 个答案:

答案 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 -2False来自1110 And 0001X)。

现在我们已经足够了解-2的一些值并确定整个原始表达式的结果。任何正整数都大于0True,因此表达式应为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。