带有OR子句的VBA赋值语句

don*_*640 2 vba

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

If (condition) Then
    array(index) = array(index) Or variable
End If
Run Code Online (Sandbox Code Playgroud)

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

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

我知道第一个分支会为自己分配数组(索引),这实际上就是我正在处理的代码是如何工作的.我不认为它与这个问题有关,但它有点让我感到奇怪,并且通常比我用VB意识到的要多得多.

不是重复的是VB.NET中有条件三元运算符吗?因为那个问题是询问是否有一个,而不是"这是什么意思"

Mat*_*don 5

不是什么.

VBA中没有三元运算符.你得到的最接近的是IIf,它会评估真实的虚假的表达式(所以不要使用它,当任一分支有副作用!):

IIf({bool-expression}, {value-if-true}, {value-if-false})
Run Code Online (Sandbox Code Playgroud)

所以它不像三元组.

我们不知道有什么array(index),但我们假设它是一些Long:

array(index) = SomeLongInteger Or variable
Run Code Online (Sandbox Code Playgroud)

您正在查看的是常规任务:

foo = 42 Or variable
Run Code Online (Sandbox Code Playgroud)

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

42 Or Variable
Run Code Online (Sandbox Code Playgroud)

Or操作者经常被用来作为一个逻辑运算符布尔表达式.

但是,上面的表达式不是布尔表达式,并且Or运算在此不是逻辑运算符.


什么.

它是一个按位运算符(在VB中,逻辑和按位运算符是相同的,这确实有点(双关语)混淆).在分配foo = 42 Or Variable,foo将采取的值按位进行比较42 Or Variable.

Debug.Print 42 Or 12 'prints 46
Run Code Online (Sandbox Code Playgroud)

怎么样?

用二进制思考.这是42:

00101010
Run Code Online (Sandbox Code Playgroud)

这是12:

00001100
Run Code Online (Sandbox Code Playgroud)

然后你按位或两个值(记住你的真值表True Or True = True; True Or False = True; False Or False = False),你会得到这样的:

00101110
Run Code Online (Sandbox Code Playgroud)

..which是二进制表示 - 这是正确的 - 46.


那么,array(index) = array(index) Or variable做到以下几点:

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

  • @TimWilliams AFAIK是正确的:当这些运算符涉及*布尔表达式*时,它们是*logical*运算符,否则是*bitwise*运算符(操作数可能隐式转换为长整数).例如,按位运算通常用于确定在处理组合枚举值时标志是否"打开". (2认同)
  • 你的答案......在VB偶尔完全无意义的方式,我正在学习讨厌O_o idk,希望它在当时有意义吗?无论如何,谢谢你清理它. (2认同)
  • @TimWilliams - 它取决于它所分配的变量的类型.如果将"Or"结果分配给"Boolean",则会进行隐式转换.如果将其分配给数字类型,则不会进行强制转换. (2认同)