如果IF语句未满足第一个条件,它会停止求值吗



如果我有一个具有两个条件的If语句,而第一个条件失败,是否会考虑第二个条件,或者直接进入else?那么,在下面的例子中,如果myList.Count == 0myString会与"值"进行比较吗?还是直接与else进行比较?

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

它将停止求值,因为您使用的是双&操作人员这被称为短路。

如果您将其更改为单安培数:

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

它将对两者进行评估。

否,不考虑。(这被称为短路。)

编译器足够聪明(也是语言规范所要求的),知道如果第一个条件是false,就没有办法将表达式求值为true

正如Jacob针对||指出的那样,当第一个条件是true时,将不会评估第二个条件。

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

若逻辑运算符为OR(||),则If语句将计算第一个表达式——若第一个表达式为true,则不计算第二个表达式。

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

否,如果使用&&、,将跳过第二个条件

如果您使用&,它将被视为

考虑以下内容:

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为false,也会被规避。

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

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

.NET支持short circuiting,因此当第一个条件失败时,它不会检查第二个条件。。。。在C#||和&是逻辑运算符|和&分别地它通常也更快。。。

表达式将从左到右求值,因为它是一个逻辑AND运算。如果为false,将停止评估。它还具有表达式中运算的最高优先级。

条件AND运算符(&&)对其布尔操作数执行逻辑AND,但仅在必要时计算其第二个操作数。条件和运算符(&&)MSDN

下面是一组部分,列出了从最高优先级到最低优先级的C#运算符。

最新更新