编译器是否继续评估一个表达式,如果第一个为false,则all必须为true?

时间:2010-10-22 14:10:02

标签: c# .net boolean-logic

我确定此问题可能已经得到了解答,所以我道歉,但我无法找到合适的搜索字词来找到答案。

鉴于以下代码示例,db.GetRecords().Any()是否已执行?

string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
         db.GetRecords().Any();

6 个答案:

答案 0 :(得分:8)

没有。 &&||都由short-circuit evaluation评估。这意味着如果a && b为false,a将返回false,如果a || b为true,则a将返回true,并且在这两种情况下都不会评估b

如果由于某种原因您不想进行短路评估,可以使用按位运算符&|

答案 1 :(得分:2)

没有。 &&运算符短路(这意味着它在表达式的任何部分求值为false后停止计算表达式。)

||运算符也会短路但在表达式的任何部分求值为true后停止计算。

答案 2 :(得分:2)

不,C#使用短路和。所以答案是没有

如果您需要同时评估两者,请使用NON-SHORT-CIRCUIT运算符,只使用一个&符号&

tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
         db.GetRecords().Any();

请注意单个&

答案 3 :(得分:2)

答案 4 :(得分:2)

我说对于C#logic-AND(&&),表达式为假的第二个,因为它们都需要为true才能使表达式为true,编译器会立即停止计算。

  

&& Operator (C# Reference)

     

条件AND运算符(&&)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。

与逻辑AND相反,逻辑OR(||)只需要一个表达式中的一个表达式为真,因为整个表达式为真。因此,false运算符不是在||评估之间短路,而是使编译器在真正的评估中短路。

  

<强> || Operator (C# Reference)

现在,这就是C#编译器的行为,但这并不意味着每个编译器都会这样做,就像在VB.NET中一样,你有两个逻辑AND运算符(And,{{3} })和两个逻辑或运算符(OrOrElse)。用于按位和逻辑连接的And运算符在第一个表达式返回false时不会短路并且无论如何都会评估另一个,而AndAlso会在第一个逻辑表达式时使评估短路是假的。这与OrOrElse相同,其中Or不会短路,OrElse会发生短路。

  

<强> AndAlso

     

对两个布尔表达式执行逻辑连接,或对两个数值表达式执行按位连接。

     

And Operator (Visual Basic)

     

对两个表达式执行短路逻辑连接。

     

AndAlso Operator (Visual Basic)

     

对两个布尔表达式执行逻辑析取,或对两个数值表达式执行按位析取。

     

<强> Or Operator (Visual Basic)

     

对两个表达式执行包含短路的逻辑分离。

简而言之,我会说这取决于您正在使用的编译器。至于C#,它确实会发生短路。

答案 5 :(得分:1)

它是短路的,允许你做这样的事情:

if(ob && ob.somefunc()) { ... }

如果两个操作都被评估,那么就有可能引用一个空对象,这将是一个运行时异常。