【问题标题】:Is the order of boolean expressions important in while loop?布尔表达式的顺序在 while 循环中是否重要?
【发布时间】:2016-01-13 00:53:15
【问题描述】:

这样的表达式有什么不同:

int a, b;
bool p = false;
while (cin >> a >> b and not p) { // code }

// and:

int a, b;
bool p = false;
while (not p and cin >> a >> b) { // code }

【问题讨论】:

  • notand 在 C++ 中更常见的写法分别为 !&&

标签: c++ loops while-loop


【解决方案1】:

不同之处在于,在 C++ 中,在评估布尔条件时会使用快捷方式。

and 的情况下,您知道如果第一条语句为假,则整个输出为假。在这种情况下,根本不会评估第二个条件。同样,如果 or 语句中的第一个语句的计算结果为 true,则不计算第二个。

那么为什么这很有用,除了在评估第二个语句时节省的一点点努力。其中一种情况是AND,如果第一个表达式为假,您可能不希望评估第二个表达式。一个原因是如果第一个语句为假,则第二个表达式可能定义不正确。

例如,在while 循环中访问向量元素时,您可能会遇到正在检查某些条件的情况。除此之外,您还必须注意确保索引在向量的范围内。所以你可以写

while (i < vector.size() && condition(vector[i]))

您可以看到,如果第一部分的计算结果为false,那么程序将在条件下访问vector[i] 时崩溃。然而,它还没有达到那个地步。这只是短路运算符的众多用途之一。

【讨论】:

  • ANDOR 不是 C++ 关键字。 andor 是。
  • 完美!谢谢你,我被那个弄坏了
  • @Steve:指出得很好。我个人从不使用andor。我更喜欢&amp;&amp;||。我用大写字母写它们只是为了指出它们是布尔运算符。
  • 我同意 - 我知道 andor 存在的唯一原因是因为这个问题! (我可能曾经知道它,但从未使用它,所以......)
  • 我可以举一些条件评估的有趣例子:int a = 0; (++a == 1) && (cout
【解决方案2】:

是的,订单很重要,因为short circuit evaluation

while (cin >> a >> b and not p) 

将接受输入,如果该操作成功,那么它将评估p。如果输入失败,那么我们结束循环并且永远不会检查p。另一方面:

while (not p and cin >> a >> b)

将评估p,如果not pfalse,则不会执行其余的条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多