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

我确定此问题可能已经得到了回答,所以我道歉,但我找不到合适的搜索条件来找到答案。

给出以下代码示例, db.GetRecords().Any()被执行?

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

不。 &&|| 通过短路评估进行评估 。 这意味着如果a为false且a || ba && b返回false 如果a为真,则a || b返回true,并且在这两种情况下都不会评估b

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

不,C#使用短路和。 所以答案是否定的

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

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

请注意单

没有

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

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

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

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

&&运算符(C#参考)

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

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

|| 运算符(C#参考)

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

和运算符(Visual Basic)

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

AndAlso运算符(Visual Basic)

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

或运算符(Visual Basic)

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

OrElse运算符(Visual Basic)

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

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

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

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

如果两个操作都被评估,则可能会引用一个null对象,这将是一个运行时exception。