定期地,我对此感到奇怪:
短路OR总是返回与未短路OR运算符相同的值吗?
我希望短路OR总是可以更快地进行评估。那么,为确保一致性,C#语言中是否包含短路OR运算符?
我错过了什么?
f()
引发异常,请考虑true || f()
和true | f()
。你看得到差别吗?前一个表达式的计算结果为true
,而后者的计算结果将引发异常。
定期地,我对此感到奇怪:
短路OR总是返回与未短路OR运算符相同的值吗?
我希望短路OR总是可以更快地进行评估。那么,为确保一致性,C#语言中是否包含短路OR运算符?
我错过了什么?
f()
引发异常,请考虑true || f()
和true | f()
。你看得到差别吗?前一个表达式的计算结果为true
,而后者的计算结果将引发异常。
Answers:
这两个操作数用于不同的事物,它们来自C,它没有布尔类型。短路版本|| 仅适用于布尔值,而非短路版本| 与整数类型一起使用,按位或执行。它只是作为布尔的非短路逻辑运算而工作,它由一个单一的0或1位表示。
http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators#Logical
|
运算符应用于两个布尔值时,or
就像在应用于两个整数值时一样||
,被编译为CIL中的同一个运算符-与之不同的是,该运算符使用brtrue
条件条件编译为CIL 跳。
这是正确的,短路OR运算符(||)将始终返回与非短路OR运算符(|)相同的值。(*)
但是,如果第一个操作数为true,则短路运算符将不会导致对第二个操作数的求值,而非短路运算符将始终导致对两个操作数的求值。这可能会影响性能,有时还会产生副作用。
因此,两者都有用:如果您关心性能,并且对第二个操作数的求值不会产生任何副作用,或者(如果您不关心它们)则一定要使用短路运算符。但是,如果由于某种原因您需要第二个操作数的副作用,则应该使用非短路运算符。
您应使用非短路运算符的示例:
if( write_customer_to_database() != SUCCESS |
write_supplier_to_database() != SUCCESS |
write_order_to_database() != SUCCESS )
{
transaction_rollback();
}
(*)某些真正变态的情况除外,在这种情况下,第一个操作数的值为false会导致第二个操作数的值为true而不是false。