多个条件语句的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
,但由于&&
短路,如果a
为null
,表达式将不会评估其余的,因此不会抛出exception。
显然,如果用&
替换&&
,如果a
或a.SomeProperty
为null
,它将抛出该exception。
从概念上讲, &&
和||
短路。
但由于那里没有任何副作用,JIT编译器可以自由地消除短路。 我不知道它是否真的这样做了。
对于: if (a == 5 && b == 9) { ... }
如果== 5条件为假,b == 9是否仍会被检查,或者它是否会自动退出,因为这种情况再也无法通过了?
如果a == 5
为false
不会在该行上执行任何其他控制。
对于: 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==5
和b==9
。