如果IF语句不符合第一个条件,IF语句是否会停止评估?
如果我有一个If
声明有两个条件 - 第一个失败,第二个条件是否会被考虑或将直接进入else
?那么,在下面的例子中,如果myList.Count == 0
,将myString
与“价值”进行比较,还是只是直接到else
?如果IF语句不符合第一个条件,IF语句是否会停止评估?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
它将停止评估,因为您使用的是双符号运算符& &。这叫做short-circuiting。
如果你把它改成一个符号:
if(myList.Count > 0 & myString.Equals("value"))
它会同时评估。
非常感谢Paul,+1。你什么时候真的想要使用&运算符(例如,如果第一个条件是错误的,你甚至想查看第二个)? – 2012-07-06 08:33:11
在这种情况下你当然不会。如果你的第二个条件是一个函数调用,你可以使用它来执行一些你想要发生的更新(不过我不知道你为什么要这么做)。 – 2012-07-06 08:38:10
@DeeMac考虑代码:'public bool DoAllWork(){return DoWork()&DoExtraWork(); }'因为我们使用单个'&',即使第一个方法调用('DoWork()')返回'false',额外的工作也会完成。如果我们使用'&&',那么额外的工作只会在第一次调用返回true的时候完成。但是,大多数程序员从不使用带有布尔运算符的'&'运算符。对于整数类型(保存比1位更多的信息),这是另一回事。 – 2012-07-06 09:28:27
不,它不会被考虑。 (这被称为short circuiting)
编译器是足够聪明(和语言规范要求),要知道,如果第一个条件是false
,没有办法表达式会true
。
而且当Jacob指出||
时,当第一个条件是true
时,第二个条件将不被评估。
反之亦然|| - 如果第一个选项为“true”,则不会评估第二个选项。 – 2012-07-06 08:31:00
我更新了答案以反映@JacobRaihle评论。 – MBen 2012-07-06 08:32:58
没有,如果你使用&&
,
如果使用&
将被视为
啊对,没有意识到,即使是一个诚实的运营商。 – 2012-07-06 08:31:38
在您的例子第二个条件将被跳过,第二条语句将仅在第一个失败评估。当两个操作数都为真时,逻辑AND &&
将仅返回true
,即短路评估。
如果逻辑运算符是AND(& &),那么IF语句将评估第一个表达式 - 如果第一个表达式为false,则不会评估第二个表达式。这对于在引用方法上检查变量是否为空有用,以避免空指针异常
如果逻辑运算符是OR(||),那么IF语句将评估第一个表达式 - 如果第一个表达式为真,它不会评估第二个。
编译器和运行时都对这种行为优化
.NET支持short circuiting
所以当第一个条件去失败,也不会检查第二condtion ....在C#||和& &是逻辑运营商的短路版本|和&分别....它往往是更快的太...
考虑如下因素:
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和暴躁的功能,即使testx是假的evaulated。
如果将测试更改为& &只检查第一个。
该表达式将从左到右进行评估,因为它是一个逻辑AND运算。如果错误,它将停止评估。它也是你表达中操作的最高优先级。
有条件-AND运算符(& &)进行逻辑与它的布尔操作数,但如果必要的话只有评价其第二操作数。 Conditional And Operator (&&) MSDN
这里是一组sections listing the C# operators starting with the highest precedence to the lowest。
C#中的*布尔逻辑运算符*是“short circuiting”。那里有很多关键字。 – 2012-07-06 08:30:55
请注意,这不是执行此操作的'if'语句,它是AND和OR boolan操作符的属性。 – unwind 2012-07-06 08:33:06