带有OR子句的VBA赋值语句

时间:2016-10-11 19:40:06

标签: vba

我遇到过一些看起来像这样的代码

If (condition) Then
    array(index) = array(index) Or variable
End If

由于不熟悉VB,它在我看来就像是在赋值语句和条件子句之间发生了某种可爱的结果。

从功能上来说,我认为它看起来像某种?:三元操作。我现在假设它是,虽然肯定不是以前的形式。

我知道第一个分支会为自己分配数组(索引),这基本上就是我工作的代码的工作方式。我并不认为它与这个问题相关,但它有点让我感到奇怪,而且通常会比我对VB的认识更多。

不是Is there a conditional ternary operator in VB.NET?的重复,因为那个问题是询问是否有一个,而不是"这是什么意思"

1 个答案:

答案 0 :(得分:5)

它的不是

VBA中没有三元运算符。你得到的最接近的是IIf,它会评估 true false 表达式(所以当任何一个分支都有副作用时,不要使用它!) :

IIf({bool-expression}, {value-if-true}, {value-if-false})

所以它不像三元一样。

我们不知道array(index)中的内容,但我们假设它有些Long

array(index) = SomeLongInteger Or variable

您正在查看的是常规作业:

foo = 42 Or variable

运行时将为foo分配值。首先,它必须计算赋值(=)运算符的右侧:

42 Or Variable

Or运算符通常用作布尔表达式中的逻辑运算符

但是上面的表达式不是布尔表达式Or运算符不是逻辑运算符

是什么

它是按位运算符(在VB中,逻辑和按位运算符是相同的,这实际上有点(双关语)混淆)。在作业foo = 42 Or Variable中,foo将获取42 Or Variable按位比较的值。

Debug.Print 42 Or 12 'prints 46

如何?

用二进制思考。这是42:

00101010

这是12:

00001100

然后你按位或这两个值(记住你的真值表True Or True = True; True Or False = True; False Or False = False)和你明白了:

00101110

..这是 - 的右边的二进制表示 - 46。

因此,array(index) = array(index) Or variable执行以下操作:

  • 阅读array(index)
  • 的值
  • 阅读variable
  • 的值
  • 按位 - 或两个值
  • 将该操作的结果分配回array(index)