48

有没有我不想使用AndAlso运算符而不是And运算符的情况?…或者我不想使用OrElse运算符而不是Or运算符?

4

3 回答 3

36

来自MSDN

短路权衡

短路可以通过不评估不能改变逻辑运算结果的表达式来提高性能。但是,如果该表达式执行其他操作,则短路会跳过这些操作。例如,如果表达式包含对 Function 过程的调用,则如果表达式短路,则不会调用该过程,并且 Function 中包含的任何其他代码都不会运行。如果您的程序逻辑依赖于任何附加代码,您可能应该避免短路运算符。

于 2008-09-10T18:56:39.870 回答
19

是否存在我不想使用 AndAlso 运算符而不是 And 运算符的情况?

当然:如果你想确保表达式的两边都被评估。例如,如果双方都是作为具有副作用的其他操作的结果返回布尔值的方法调用,则可能是这种情况。

但一般来说,只要在 C/C++/C# 中使用AndAlso/ ,OrElse就使用&&/ ||,这当然是绝大多数时间。

于 2008-09-10T18:54:11.420 回答
0

它们是 VB.net 中完全不同的功能,并且都有自己的用例(尽管对于最常见的用途,两者都可以使用)

AndAlso并且OrElse条件运算符,它们返回一个 true 或 false 布尔值,并且只评估他们需要的内容,直到它们达到无法更改的结果(对于 AndAlso 为 false,对于 OrElse 为 true)。这些等价于 C# 和 Java 等语言&&||

And并且Or位运算符,它们将传递给它们的任何位组合成一个结果,并且由于这些位总是可以通过进一步的评估来改变,因此需要评估所有内容。这些等价于 C# 和 Java 等语言&|

大多数时候,当您查看和/或操作时,您需要条件结果。按位运算将产生一个真或假的值,并且(通常)会匹配来自适当条件运算符的真假结果,它们平均只需要更长的时间,因为它们会评估所有内容。

当您关心值中的特定位时,应使用按位运算符,通常用于以尽可能紧凑的方式存储设置或权限,并尽可能快地读取和应用它们。例如,在基于 Unix 的系统中,文件的读/写/执行权限以这种方式使用位标志:

0b001 - 执行权限
0b010 - 写入权限
0b100 - 读取权限

因此,在十进制中,值 7 可以完成所有三个操作,值 4 只能读取,6 可以读取和写入,等等。如果有人试图写入文件,它会通过使用检查他们的权限And 0b010并获得真值或基于该位置的位的错误结果。要更新该值以让用户执行文件,您将使用Or 0b001他们当前的权限并存储结果。

区别就在这里:

0b001 (真实) AndAlso 0b010 (真实) = 0b000 (虚假)
0b001 (真实) AndAlso 0b010 (真实) = True

于 2021-11-04T15:12:16.683 回答