当我们在 while 循环中有多个条件时,我们什么时候跳过更多条件?

问题描述 投票:0回答:2

比如我们在一个while循环中有三个条件:

while (true || false || false)
{
  //Do something...
}

我说的是仅由

||
运算符分隔的条件。我相信当我们遇到这个while循环时,只要遇到第一个
true
语句,我们就会跳过其他条件。 我知道如果我们在 while 循环中有两个由
||
运算符分隔的条件,这是真的。但是,如果我们有两个以上的条件,当遇到第一个
true
条件时,我们是否会跳过更多条件,继续 while 循环? 这是因为,
while
循环不知道,我们在
while
循环中还有多少条件。并且会走得更远。 对于两个条件,当遇到第一个
true
条件时,我们将跳过进一步评估条件。但是,当有多个条件时,由
||
运算符分隔,当遇到第一个
true
条件时,我们是否仍会跳过评估其他条件? 如果您能告诉我,在这种情况下(当我们在
while
循环中有多个条件,由
||
运算符分隔时)在编译时和运行时发生了什么,这将很有帮助。 我们怎么知道什么时候跳过进一步的条件? 谢谢你的帮助!

c# multiple-conditions
2个回答
1
投票

假设实际条件不是常量 - 这称为“短路”,并在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;
}

演示@sharplab.io


1
投票

如果你能告诉我,在编译时和运行时发生了什么,在这种情况下(当我们在 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
抛出空引用异常。)

© www.soinside.com 2019 - 2024. All rights reserved.