在c ++中就地bool AND和OR?

时间:2013-07-11 09:28:49

标签: c++ boolean operators in-place

在这行中是否存在类似于c ++的bool的就地AND和OR运算符?

bool someOk=false;
for(int i=0; i<10; i++){
  someOk||=funcReturningBoolOnSuccess(i);
}

(我知道我可以写someOk=someOk||funcReturningBoolOnSuccess(i),但它不是很漂亮。)

3 个答案:

答案 0 :(得分:3)

答案很简短:不,C ++语法不允许这样的结构。

你必须使用:

something = something || something_else;

但是......如果你的函数在成功时返回bool(如成功则返回true)...为什么不使用以下内容?

someOk = funcReturningBoolOnSuccess(i);

无论如何都不会在失败时返回false吗?似乎不合逻辑。

你为什么不这样做:

bool someOk=false;
for(int i=0; i<10; i++){
  if (funcReturningBoolOnSuccess(i)) {
      someOk = true;
      break;
  }
}

效率更高:)

答案 1 :(得分:1)

只要返回bool,您就可以|=用于此目的(除非您严格要求在第一次成功后调用funcReturningBoolOnSuccess(i); - 在这种情况下您必须使用一些ifbreak或更改for循环的条件。

如果结果不是bool值,那么您可能需要将其转换为该值,因为|=确实是按位运算。通过bool(&#34; bang-bang&#34;或&#34; not-not&#34;)的简单技巧,可以将C或C ++中的任何基本类型转换为!!。 - 它使true的任何非零和false的结果为零,这就是我们想要的。

答案 2 :(得分:0)

我知道它不是就地,但它更容易使用。

void OR(bool& x,bool y)
{
   x = x || y;
}

/* later on */

bool someOk = false;

// someOk = false
// funcRetBoolOnSuc(8) = false
OR(someOk,funcRetBoolOnSuc(8));
// someOk = false

// someOk = false
// funcRetBoolOnSuc(8) = true
OR(someOk,funcRetBoolOnSuc(9));
// someOk = true

或者,因为bool只接受0,1作为值,你可以这样做:

someOk |= funcRetBoolOnSuc(x);