如果 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 == 0myString 会与“值”进行比较还是直接与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 语句不满足第一个条件,它会停止评估吗?的主要内容,如果未能解决你的问题,请参考以下文章

循环

如果不满足条件,我可以为 Axios Get Method 编写 if/else 语句吗?

带有if条件的隐式布尔评估[重复]

Python 会懒惰地评估 if 的条件吗? [复制]

Python之流程控制

是否保证不会对 if 语句进行不必要的评估? [复制]