1

沿着这条线,在c ++中是否有类似就地AND和OR运算符的东西?

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

(我知道我会写someOk=someOk||funcReturningBoolOnSuccess(i),但它不那么漂亮)。

4

3 回答 3

3

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

你必须使用:

something = something || something_else;

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

someOk = funcReturningBoolOnSuccess(i);

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

你为什么不这样做:

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

效率更高:)

于 2013-07-11T09:38:20.337 回答
1

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

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

于 2013-07-11T09:42:09.253 回答
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);
于 2013-07-11T09:42:00.177 回答