2010-05-19 20 views
12

我想知道当一个程序处理具有多个条件的if结构时会发生什么。我有一个想法,但我不确定。我举一个例子:如果if结构的第一部分是假的,会发生什么?

List<string> myTestList = null; 
if (myTestList != null && myTestList.Count > 0) 
{ 
    //process 
} 

列表为空。在处理if语句时,是否会从一个条件为假的情况下从左向右退出if?

我试过了,似乎没有发现错误,所以我假设上面解释了它,但我不确定。

+0

当你添加一个'else'条款,你看到了什么情况? – 2010-05-19 10:07:57

+0

它被调用,这就是为什么我认为如果在条件为假的情况下发生故障 – Terry 2010-05-19 10:20:01

+0

“崩溃”? “打破”是什么意思? – 2010-05-19 10:58:56

回答

23

这是重要的&&。这是短路,所以Count永远不会被评估;条件从左到右进行评估。

还有一个非短路运算符(&),但它是很难看到在if测试中;它主要用于按位操作(在int等)。

从规格:

条件逻辑运算符

&&||符被称为条件逻辑运算符。 它们也被称为 “短路”逻辑运算符。

...

&&||运营商是&| 运营商的条件版本:

  • 操作x && y对应于操作x & y,除了y 只有当评估x不是false
  • 操作x || y对应于操作x | y,不同之处在于y 仅当x不是true进行评价。
2

在C#和大多数语言,&&||短路,即,如果表达式的第一部分就足以确定结果,第二部分是保证不执行。

您使用的代码是惯用的C#代码。

2

如果参考文献是null,评估将立即停止。这就是所谓的逻辑表达式短路评估 - 如果&&的左边部分是false,则根本不评估权利。

2

它被短路。

a && b 

如果a是假的,b将不进行评估。我们可以使用这种行为,因为表达式将始终为假。

同样,

a || b 

如果a是真实的,b将不进行评估。

6

在大多数(但不是全部)现代语言中,都有一个称为"short circuit boolean evaluation"的功能。这意味着如果&&条件的第一部分是错误的,那么第二部分根本不会被评估。

类似的功能适用于||,其中如果第一部分是true,则不评估第二部分。

请注意,此功能不限于if语句。下面的内容也是有效的,不会尝试引用Count如果myTestListnull

bool b = myTestList != null && myTestList.Count > 0; 
1

是,短路评价应该被使用。我本人不是C#开发人员,但我从this Wikipedia article读到这个。

2

大多数现代编程语言,包括C#,都实现了所谓的麦卡锡序贯连接算子。这意味着:

a && b <=> a ? b : false 

如果你看看这两个等价表达式的第二,它变得很清楚,b评估当且仅当a是真实的。相反地​​:

a || b <=> a ? true : b 
0
对于

在下面的示例程序:

空隙测试() { BOOL F1 = 0; bool f2 = 0;

如果(F2 & &(F1 = 1)){ COUT < < “内部1” < < ENDL; } COUT < < “F1” < < F1 < < “:F2:” < < F2 < < ENDL;

如果((F1 = 1)& & F2) {COUT < < “内部2” < < ENDL; } COUT < < “F1” < < F1 < < “:F2:” < < F2 < < ENDL; }

输出将是: F1 0:F2:0

F1 1:F2:0

这基本上示出了从左至右正在执行的,如果循环。 1.在第一个if循环中,第一个条件失败,并且不费心去测试第二部分。 2.在第二个if循环中,首先运行第一部分,然后运行第二部分。

这将适用于C++。希望这可以帮助。

  • 伊瓦
相关问题