我想知道当程序处理具有多个条件的if结构时会发生什么。我有个主意,但我不确定。我举个例子:
List<string> myTestList = null;
if (myTestList != null && myTestList.Count > 0)
{
//process
}
该列表为空。处理if语句时,只要一个条件为假,它是否会从左到右退出if?
我已经尝试过并且似乎没有错误,所以我假设上面解释了它,但我不确定。
答案 0 :(得分:25)
重要的是&&
。这是短路的,因此永远不会评估Count
;条件从左到右进行评估。
还有一个非短路运算符(&
),但在if测试中很少见非常;它主要用于按位运算(在int
等)。
来自规范:
条件逻辑运算符
&&
和||
运算符称为条件逻辑运算符。 他们也被称为 “短路”逻辑运算符。...
&&
和||
运算符是&
和|
的条件版本 操作符:
- 操作
x && y
对应于操作x & y
,但y
除外 仅在x
不是false
时才会进行评估。- 操作
x || y
对应于操作x | y
,但y
除外 仅在x
不是true
时才会进行评估。
答案 1 :(得分:6)
在大多数(但不是全部)现代语言中,有一个名为"short circuit boolean evaluation"的功能。这意味着如果&&
条件的第一部分为假,则根本不评估第二部分。
类似的功能适用于||
,如果第一部分是 true ,则不评估第二部分。
请注意,此功能不仅限于if
语句。以下内容也有效,如果Count
为myTestList
,则不会尝试引用null
:
bool b = myTestList != null && myTestList.Count > 0;
答案 2 :(得分:2)
在C#和大多数语言中,&&
和||
短路,即如果表达式的第一部分足以确定结果,则第二部分保证不被执行。
您使用的代码是惯用的C#代码。
答案 3 :(得分:2)
如果引用为null
,评估将立即停止。这称为逻辑表达式短路评估 - 如果&&
的左侧部分是false
,则根本不评估权利。
答案 4 :(得分:2)
它被短路了。
a && b
如果a
为false,则不会评估b
。我们可以使用此行为,因为表达式始终为false。
类似地,
a || b
如果a
为真,则不会评估b
。
答案 5 :(得分:2)
大多数现代编程语言,包括C#,都实现了麦卡锡的顺序连接算子。这意味着:
a && b <=> a ? b : false
如果你看一下这两个等价表达式中的第二个,很明显当且仅当b
为真时才会计算a
。相反:
a || b <=> a ? true : b
答案 6 :(得分:1)
是的,应该使用短路评估。我自己不是C#开发人员,但是我从this Wikipedia article开始阅读。
答案 7 :(得分:0)
对于以下示例程序:
void test() { bool f1 = 0; bool f2 = 0;
if(f2&amp;&amp;(f1 = 1)) {cout&lt;&lt; “内部1”&lt;&lt; ENDL; } cout&lt;&lt; “F1”&lt;&lt; f1&lt;&lt; “:F2:”&lt;&lt; f2&lt;&lt; ENDL;
if((f1 = 1)&amp;&amp; f2) {cout&lt;&lt; “内部2”&lt;&lt; ENDL; } cout&lt;&lt; “F1”&lt;&lt; f1&lt;&lt; “:F2:”&lt;&lt; f2&lt;&lt; ENDL; }
输出将是: F1 0:F2:0
F1 1:F2:0
这基本上表明if循环是从左到右执行的。 1.在第一个if循环中,第一个条件失败,并且它没有费心去测试第二个部分。 2.在第二个if循环中,第一个部分先运行,然后运行第二个部分。
这适用于C ++。希望这会有所帮助。