如果if结构的第一部分是假的,会发生什么?

时间:2010-05-19 10:05:45

标签: c# if-statement

我想知道当程序处理具有多个条件的if结构时会发生什么。我有个主意,但我不确定。我举个例子:

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

该列表为空。处理if语句时,只要一个条件为假,它是否会从左到右退出if?

我已经尝试过并且似乎没有错误,所以我假设上面解释了它,但我不确定。

8 个答案:

答案 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语句。以下内容也有效,如果CountmyTestList,则不会尝试引用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 ++。希望这会有所帮助。

  • 的Ivar