如果在C#中有if语句,则检查多个条件:
if (a == 5 && b == 9) { ... }
如果 a == 5 条件为false,是否仍会检查 b == 9 ,还是会自动退出,因为这种情况不再可以通过了?
同样,对于OR if语句:
if (a == 5 || b == 9) { ... }
如果 a == 5 为真, b == 9 是否会被检查?
答案 0 :(得分:16)
&&
和||
都是“短路”运算符,这意味着如果从左操作数中得知答案,则不会对右操作数进行求值。
这意味着:
a && b
如果b
为false,则不会评估 a
,因为最终答案已知。
同样地:
a || b
如果b
为真,则不会评估 a
,因为最终答案已知。
如果想要要评估两个操作数,请改用&
和|
运算符。
这样做的好处是,如果评估了所有操作数,您可以编写失败的表达式。这是一个典型的if语句:
if (a != null && a.SomeProperty != null && a.SomeProperty.Inner != null)
... use a.SomeProperty.Inner
如果a为null,并且表达式将继续评估a.SomeProperty
,则会抛出NullReferenceException
,但由于&&
短路,如果a
为null
,表达式不会评估其余的,因此不会抛出异常。
显然,如果您将&&
替换为&
,如果a
或a.SomeProperty
为null
,则会抛出该异常。
答案 1 :(得分:2)
从概念上讲,&&
和||
短路。
但是由于你没有任何副作用,JIT编译器可以自由地消除短路。我不知道它是否确实如此。
答案 2 :(得分:1)
对于: if (a == 5 && b == 9) { ... }
如果== 5条件为假,b == 9仍然会被检查,或者是否 自动退出,因为这不能再通过了吗?
如果a == 5
为false
,则该行不会执行任何其他控件。
对于: if (a == 5 || b == 9) { ... }
如果== 5为真,b == 9仍会被检查吗?
立即进入内部,因为第一个条件已满足要求。
答案 3 :(得分:0)
使用AND运算符,根据布尔逻辑,所有条件必须计算为TRUE。如果只满足其中一个,则条件的结果将为FALSE。
如果== 5条件为假,b == 9仍然会被检查,或者是否 自动退出,因为这种情况再也无法通过了吗?
它会自动退出,因为第一个条件为false且结果已知。
对于OR运算符,您至少需要其中一个条件为TRUE并且您的逻辑将被执行。如果第一个不满意,应用程序将检查其他条件。
如果== 5为真,b == 9仍会被检查吗?
不,不会检查,因为第一个条件为TRUE,然后没有必要检查另一个条件。
答案 4 :(得分:0)
短标准是由标准定义的。否则就无法说出表达的结果如何:
if (a != null && a.IsValid) { ... }
在某些C#编译器中它可以正常工作,在其他一些编译器中它会导致异常。这就是为什么标准可以定义共同行为的原因。
编辑:澄清了最后的陈述。
答案 5 :(得分:-1)
在AND检查
a==5
如果是真的那么
将转到b==9
其他地方
不会转到b==9
。
在OR中:
它会检查a==5
和b==9
。