【问题标题】:Lazy "and" expression evaluation [duplicate]懒惰的“和”表达式评估[重复]
【发布时间】:2018-06-16 00:09:48
【问题描述】:

我一直在使用以下代码块来询问用户输入并在控制台应用程序中检查其有效性。

do
{
    Console.Write("Enter X value:");    // prompt
} while (!(int.TryParse(Console.ReadLine(),out temp) && (temp<=10) && (temp>=0))); // repeat if input couldn't be parsed as an integer or out of range

“&&”(和)表达式评估是惰性的,这是否已记录在案?即:如果第一个操作数为假,那么它不会解析第二个操作数?我可以在生产构建中依赖它吗?我可以期望它在其他编译器中的行为相同吗?
这是我在 PPCG.SE 中学到的东西

此外,该块是否可以更易于阅读或简化为单行?

【问题讨论】:

  • 如果你愿意read the documentation,你会发现令人惊奇的事情:"条件与运算符 (&&) 对其布尔操作数执行逻辑与,但只计算如果需要,它的第二个操作数”

标签: c# lazy-evaluation boolean-expression


【解决方案1】:

“&&”(和)表达式评估是否已记录在案? 懒惰吗?

Yes as mentioned on the C# reference page:

条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数。换句话说,它是一个短路操作符

我可以在生产构建中依赖它吗?我可以期望它会 在其他编译器中的行为是否相同?

是的,它的行为应该始终相同。

此外,可以使块更易于阅读或简化为 单机?

除了去掉一些多余的参数,你不能只用一行来简化。

但是,您可以通过将(temp&lt;=10) &amp;&amp; (temp&gt;=0) 的逻辑隐藏到某些方法中来使其更具可读性,例如:

public static bool IsValidRange(int temp) =>  temp >= 0 && temp <= 10;

那么你的 while 条件变为:

while (!(int.TryParse(Console.ReadLine(), out temp) && IsValidRange(temp)));

现在方法的名称读作问题陈述IsValidRange

【讨论】:

  • 作为补充说明,&amp;&amp;|| 由于这种行为通常被称为“短路运算符”。大多数主要的编程语言都是这样对待它们的。
【解决方案2】:

这是 C# 语言规范中有关 &amp;&amp;|| 的相关部分:

第 7.12 节条件逻辑运算符

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

  • x && y 操作对应x & y 操作, 除了只有当 x 不为假时才评估 y。
  • 操作 x || y 对应于操作 x | y,除了 y 仅被评估 如果 x 不正确。

由于它在规范中,因此无论您使用什么编译器,它的行为都应该相同。如果不是,那么您使用的编译器不被视为“C#”编译器。 :)

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2016-12-14
    • 2021-12-25
    • 2018-04-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多