如果 IF 语句不满足第一个条件,它会停止评估吗?
Posted
技术标签:
【中文标题】如果 IF 语句不满足第一个条件,它会停止评估吗?【英文标题】:Will an IF statement stop evaluating if it fails the first condition? 【发布时间】:2012-07-06 16:45:45 【问题描述】:如果我有一个带有 2 个条件的 If
语句 - 第一个条件失败,是否会考虑第二个条件,还是会直接转到 else
?那么,在下面的例子中,如果myList.Count == 0
,myString
会与“值”进行比较还是直接与else
比较?
if(myList.Count > 0 && myString.Equals("value"))
//Do something
else
//Do something else
【问题讨论】:
C# 中的布尔逻辑运算符是“短路”的。那里有很多关键字。 请注意,执行此操作的不是if
语句,而是 AND 和 OR 布尔运算符的属性。
【参考方案1】:
它将停止评估,因为您使用的是双 && 运算符。这称为short-circuiting。
如果您将其更改为单个 & 符号:
if(myList.Count > 0 & myString.Equals("value"))
它会同时评估两者。
【讨论】:
非常感谢保罗,+1。那么您何时真正想要使用 & 运算符(即,如果第一个条件为假,您何时甚至想查看第二个)? 在这种情况下你肯定不会。如果您的第二个条件是执行一些您希望发生的更新的函数调用,您可能会使用它(但我不知道您为什么要这样做)。 @DeeMac 考虑代码:public bool DoAllWork() return DoWork() & DoExtraWork();
因为我们使用单个 &
,所以即使第一个方法调用 (DoWork()
) 返回 false
,也会完成额外的工作。如果我们改用&&
,那么只有在第一个调用返回true
时才会完成额外的工作。但我猜大多数程序员从不使用带有布尔值的&
运算符。对于整数类型(包含比 1 位更多的信息),那就另当别论了。
@JeppeStigNielsen - 我想这是一种简洁的方法,可以调用两个方法,然后在同一个“呼吸”中评估它们,而不必将返回值分配给布尔值,然后编写一个新的 IF 语句。感谢您的输入伙伴。
在非空检查方面非常有用,因此优先考虑 IsNullOrEmpty 将确保在第二个条件可能这样做时不会引发异常。【参考方案2】:
不,不会考虑。 (这被称为short circuiting。)
编译器足够聪明(并且语言规范要求)知道如果第一个条件是false
,则表达式将无法计算为true
。
正如 Jacob 指出的 ||
,当第一个条件是 true
时,不会评估第二个条件。
【讨论】:
反之亦然 || - 如果第一个选项是true
,则不会评估第二个选项。【参考方案3】:
如果逻辑运算符为 AND (&&),则 IF 语句将计算第一个表达式 - 如果第一个表达式为假,则不会计算第二个表达式。这对于在引用上调用方法之前检查变量是否为空很有用 - 以避免空指针异常
如果逻辑运算符是 OR (||),则 IF 语句将计算第一个表达式 - 如果第一个表达式为真,则不会计算第二个表达式。
编译器和运行时针对这种行为进行了优化
【讨论】:
【参考方案4】:不,如果你使用&&
,第二个条件将被跳过,
如果您使用&
,将被考虑
【讨论】:
啊,对了,老实说,没想到这竟然是个接线员。【参考方案5】:考虑以下几点:
static int? x;
static int? y;
static void Main(string[] args)
x = 5;
if (testx() & testy())
Console.WriteLine("test");
static Boolean testx()
return x == 3;
static Boolean testy()
return y == 10;
如果您同时跟踪 testx 和 testy 函数,即使 testx 为假。
如果您将测试更改为 &&,则只检查第一个。
【讨论】:
【参考方案6】:在您的示例中,仅当第一个语句失败时才会评估第二个语句。逻辑与&&
只会在两个操作数都为真时返回true
,也就是短路评估。
【讨论】:
【参考方案7】:.NET 支持short circuiting
,所以当第一个条件失败时,它不会检查第二个条件....在 C# ||和 && 是逻辑运算符的短路版本 |和 & 分别......它通常也更快......
【讨论】:
【参考方案8】:表达式将从左到右计算,因为它是逻辑与运算。如果为假,它将停止评估。它还具有您表达式中操作的最高优先级。
条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数。 Conditional And Operator (&&) MSDN
这是一组sections listing the C# operators starting with the highest precedence to the lowest。
【讨论】:
以上是关于如果 IF 语句不满足第一个条件,它会停止评估吗?的主要内容,如果未能解决你的问题,请参考以下文章