比如我们在一个while循环中有三个条件:
while (true || false || false)
{
//Do something...
}
我说的是仅由
||
运算符分隔的条件。我相信当我们遇到这个while循环时,只要遇到第一个true
语句,我们就会跳过其他条件。
我知道如果我们在 while 循环中有两个由 ||
运算符分隔的条件,这是真的。但是,如果我们有两个以上的条件,当遇到第一个true
条件时,我们是否会跳过更多条件,继续 while 循环?
这是因为,while
循环不知道,我们在 while
循环中还有多少条件。并且会走得更远。
对于两个条件,当遇到第一个 true
条件时,我们将跳过进一步评估条件。但是,当有多个条件时,由 ||
运算符分隔,当遇到第一个 true
条件时,我们是否仍会跳过评估其他条件?
如果您能告诉我,在这种情况下(当我们在 while
循环中有多个条件,由 ||
运算符分隔时)在编译时和运行时发生了什么,这将很有帮助。
我们怎么知道什么时候跳过进一步的条件?
谢谢你的帮助!
假设实际条件不是常量 - 这称为“短路”,并在docs中为
&&
和||
运算符进行了解释:
条件逻辑与运算符 &&
条件逻辑与运算符
,也称为“短路”逻辑与运算符,计算其操作数的逻辑与。如果&&
和x && y
的计算结果都为x
,则y
的结果为真。否则,结果是true
。如果false
的计算结果为x
,则false
不被计算。y
条件逻辑或运算符 ||
条件逻辑或运算符
,也称为“短路”逻辑或运算符,计算其操作数的逻辑或。如果||
或x || y
的计算结果为x
,则y
的结果为真。否则,结果是true
。 如果false
评估为x
,则true
不被评估.y
|
运算符:
逻辑或运算符 |
运算符计算其操作数的逻辑或。如果|
或x | y
的计算结果为true
,则x
的结果为y
。否则,结果是true
.false
运算符 计算两个操作数,即使左侧操作数的计算结果为|
,因此无论右侧操作数的值如何,运算结果都是true
。true
bool Get(int i)
{
Console.WriteLine(i);
return i == 1;
}
// prints 1 2 InWhile
while (Get(1) | Get(2))
{
Console.WriteLine("InWhile");
break;
}
如果你能告诉我,在编译时和运行时发生了什么,在这种情况下(当我们在 while 循环中有多个条件,由 || 运算符分隔时),这将很有帮助。
如果你 literally 有
while(true || false || false)
,或编译器可以在编译时推导出的等效编译时常量,那么这将编译为与 while(true)
相同的代码,因为 true || false || false
可以在编译时计算是真实的。编译器还会忽略 while
循环之后的任何代码,除非它可以确定您正在使用 break;
或其他一些允许退出 while
循环的结构。
同样,如果你有像
while(true && false)
这样的东西,整个 while
循环将从编译时代码中省略,因为它被认为是不可访问的。
如果您使用的表达式的变量值在编译时无法确定,例如
while(node == null || node.Value != value)
,那么在运行时将计算第一个表达式(node == null
),如果发现它是true
那么表达式的其余部分将 short-circuited 正如 Guru Stron 在他的回答中指出的文档所指定的那样。 (在我刚刚给出的示例中,这将防止 node.Value
抛出空引用异常。)