IF语句是否会在第一个条件失败时停止评估?

时间:2012-07-06 08:28:01

标签: c# if-statement conditional-statements

如果我有If语句有2个条件 - 第一个失败,第二个条件是否会被考虑,还是会直接进入else?因此,在以下示例中,如果myList.Count == 0,将myString与“值”进行比较,还是直接与else进行比较?

if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}

8 个答案:

答案 0 :(得分:78)

它会停止评估,因为你正在使用双&符号&&运营商。这称为short-circuiting

如果您将其更改为单个&符号:

if(myList.Count > 0 & myString.Equals("value"))

它会评估两者。

答案 1 :(得分:20)

不,它不会被考虑。 (这称为short circuiting。)

编译器足够聪明(并且语言规范要求)知道如果第一个条件是false,则表达式无法计算为true

正如雅各布指出||,当第一个条件是true时,第二个条件将不会被评估。

答案 2 :(得分:7)

如果逻辑运算符是AND(&&),则IF语句将评估第一个表达式 - 如果第一个表达式为false,则不会计算第二个表达式。这对于在引用上调用方法之前检查变量是否为空非常有用 - 以避免空指针异常

如果逻辑运算符是OR(||),则IF语句将评估第一个表达式 - 如果第一个表达式为真,则不会计算第二个表达式。

编译器和运行时针对此行为进行了优化

答案 3 :(得分:4)

不,如果您使用&&

,将跳过第二个条件

如果您使用&,则会将其视为

答案 4 :(得分:2)

考虑下面的内容:

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是假的,也会被评估。

如果您将测试更改为&&只检查了第一个。

答案 5 :(得分:1)

在您的示例中,仅在第一个语句失败时才会评估第二个语句。当两个操作数都为真时,逻辑AND &&将仅返回true,即短路评估

答案 6 :(得分:1)

.NET支持short circuiting所以当第一个条件失败时,它不会检查第二个条件....在C#||和&&是逻辑运算符的短路版本和&分别......它通常也更快......

答案 7 :(得分:0)

表达式将从左到右进行计算,因为它是一个逻辑AND操作。如果为false,则会停止评估。它还具有表达式中操作的最高优先级。

  

条件AND运算符(&&)执行其bool操作数的逻辑AND,但仅在必要时才计算其第二个操作数。 Conditional And Operator (&&) MSDN

这是一组sections listing the C# operators starting with the highest precedence to the lowest