【问题标题】:Will "while( bool a && bool b )" check both a and b even if a proves to be false? [duplicate]即使 a 被证明是错误的,“while(bool a && bool b)”也会检查 a 和 b 吗? [复制]
【发布时间】:2020-08-22 05:40:43
【问题描述】:

在某些情况下,我必须遍历数组/向量来寻找满足涉及元素值的条件的元素。过去我会选择一个简单的 for 循环和一个if 声明,不过最近看到一段代码,看起来更简单。准确的说:

我以前是这样的:

for( int i = 0; i < vector.size(); i++ )
    if( condition[i] )
       do_stuff;

现在我对这个很好奇:

int i = 0;
while( i < vector.size() || condition[i] )
    i++;

我喜欢这个定义,它更短,事实上我相信它更容易阅读,但困扰我的是向量为空的情况。

我不确定|| 处理布尔值的方式,它是否检查第一个条件,如果它为假,则检查第二个条件?还是它仍然检查两者?如果是这种情况,应该有一个错误,因为我正在检查一个不存在的元素的条件。

在一个空向量上尝试了代码后,它编译并运行得很好,只是为了确保我也尝试了这个:

bool a , b = false;
if( b || a )
   dostuff;

而且效果也很好。

但是对我来说,检查不存在值的条件似乎仍然不完全正确,我不确定是否应该使用它。可以吗?还是我应该去其他的东西?

任何帮助都会很棒。

编辑 0:由于向量为空,它仍然应该抛出错误。 0

【问题讨论】:

  • i &lt; vector.size() || condition[i] 即使是短路评估也是错误的,因为如果第一部分是 false,第二部分将被检查 并且 i 将被排除在外界限。

标签: c++ boolean boolean-operations


【解决方案1】:

是的,operator|| 执行短路评估。

内置运算符 && 和 ||执行短路评估(如果在评估第一个操作数后结果已知,则不评估第二个操作数),但重载运算符的行为类似于常规函数调用,并且始终评估两个操作数

这意味着对于while( i &lt; vector.size() || condition[i] ),如果i &lt; vector.size()true,则不会评估condition[i];如果是false,则将进一步评估condition[i];现在你可能会看到这里有一个错误。

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 2013-11-19
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多