如果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
语句。 以下内容也有效,如果myTestList
为null
,则不会尝试引用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 ++。 希望这可以帮助。
- 伊瓦尔