多个条件语句的AND / OR(&& / ||)逻辑

如果在C#中有if语句,则检查多个条件:

if (a == 5 && b == 9) { ... } 

如果== 5条件为假, b == 9是否仍会被检查,或者它是否会自动退出,因为这种情况再也无法通过了?

同样,对于OR if语句:

 if (a == 5 || b == 9) { ... } 

如果== 5为真, b == 9仍然会被检查吗?

两者都是&&|| 是“短路”运算符,这意味着如果从左操作数得知答案,则不评估右操作数。

这意味着:

 a && b 

如果a为假,则不会评估b ,因为最终答案已知。

同样:

 a || b 

如果a为真,则不会评估b ,因为最终答案已经知道。

如果评估两个操作数,请使用&| 而是运营商。

这样做的好处是,如果评估了所有操作数,您可以编写失败的表达式。 这是一个典型的if语句:

 if (a != null && a.SomeProperty != null && a.SomeProperty.Inner != null) ... use a.SomeProperty.Inner 

如果a为null,并且表达式将继续计算a.SomeProperty ,它将抛出NullReferenceException ,但由于&&短路,如果anull ,表达式将不会评估其余的,因此不会抛出exception。

显然,如果用&替换&& ,如果aa.SomePropertynull ,它将抛出该exception。

从概念上讲, &&|| 短路。

但由于那里没有任何副作用,JIT编译器可以自由地消除短路。 我不知道它是否真的这样做了。

对于: if (a == 5 && b == 9) { ... }

如果== 5条件为假,b == 9是否仍会被检查,或者它是否会自动退出,因为这种情况再也无法通过了?

如果a == 5false不会在该行上执行任何其他控制。

对于: if (a == 5 || b == 9) { ... }

如果== 5为真,b == 9仍然会被检查吗?

立即进入内部,因为第一个条件已经满足要求。

使用AND运算符,根据布尔逻辑,所有条件必须计算为TRUE。 如果只满足其中一个,则条件的结果将为FALSE。

如果== 5条件为假,b == 9是否仍会被检查,或者它是否会自动退出,因为这种情况再也无法通过了?

它会自动退出,因为第一个条件为false且结果已知。

对于OR运算符,您至少需要其中一个条件为TRUE并且您的逻辑将被执行。 如果第一个不满意,应用程序将检查其他条件。

如果== 5为真,b == 9仍然会被检查吗?

不,它不会被检查,因为第一个条件为TRUE,然后没有必要检查另一个条件。

短标准由标准定义。 否则就不可能说出表达的结果是什么,例如:

 if (a != null && a.IsValid) { ... } 

在一些C#编译器中它可以正常工作,在其他一些编译器中它会导致exception。 这就是为什么标准定义共同行为的原因。

编辑:澄清最后声明。

在AND检查a==5如果为真,那么将转到b==9否则不会转到b==9 。 在OR中:它将检查a==5b==9