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

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

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

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

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

这是&&很重要。 这是短路的,因此永远不会评估Count ; 条件从左到右评估。

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

从规格:

条件逻辑运算符

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

&&|| 运算符是&|条件版本 运营商:

  • 操作x && y对应于操作x & y ,除了仅当x不为false时才计算y
  • 操作x || y x || y对应于操作x | y x | y ,除了仅在x不为true时才计算y

在大多数(但不是全部)现代语言中,有一个称为“短路布尔评估”的function 。 这意味着如果&& condition的第一部分为false,则根本不评估第二部分。

类似的function适用于|| ,如果第一部分为 ,则不评估第二部分。

请注意,此function不仅限于if语句。 以下内容也有效,如果myTestListnull ,则不会尝试引用Count

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

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

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

如果引用为null则评估将立即停止。 这称为逻辑表达式短路评估 – 如果&&的左侧部分为false ,则根本不评估权利。

它被短路了。

 a && b 

如果a为假,则不会评估b 。 我们可以使用此行为,因为表达式将始终为false。

同样的,

 a || b 

如果a为真,则不会评估b

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

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

如果你看一下这两个等价表达式中的第二个,很明显当且仅当a为真时才会计算b 。 反之亦然:

 a || b <=> a ? true : b 

是的,应该使用短路评估。 我自己不是C#开发人员,但我从这篇维基百科文章中读到了这一点 。

对于以下示例程序:

void test(){bool f1 = 0; bool f2 = 0;

if(f2 &&(f1 = 1)){cout <<“Inside 1”<< endl; } cout <<“F1”<< f1 <<“:F2:”<< f2 << endl;

if((f1 = 1)&& f2){cout <<“Inside 2”<< endl; } cout <<“F1”<< f1 <<“:F2:”<< f2 << endl; }

输出为:F1 0:F2:0

F1 1:F2:0

这基本上表明if循环是从左到右执行的。 1.在第一个if循环中,第一个条件失败,并且它没有费心去测试第二个部分。 2.在第二个if循环中,首先运行第一部分,然后运行第二部分。

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

  • 伊瓦尔