在这条线上,是否有像C++中的bools的就地AND和OR运算符?in-place bool AND和OR在C++中?
bool someOk=false;
for(int i=0; i<10; i++){
someOk||=funcReturningBoolOnSuccess(i);
}
(我知道我可以写someOk=someOk||funcReturningBoolOnSuccess(i)
,但它不是很漂亮)。
在这条线上,是否有像C++中的bools的就地AND和OR运算符?in-place bool AND和OR在C++中?
bool someOk=false;
for(int i=0; i<10; i++){
someOk||=funcReturningBoolOnSuccess(i);
}
(我知道我可以写someOk=someOk||funcReturningBoolOnSuccess(i)
,但它不是很漂亮)。
答案很简短:不,C++语法不允许这样的结构。
你必须使用:
something = something || something_else;
但是....如果你的函数成功返回布尔(如,成功真的)......你为什么不只是使用以下?
someOk = funcReturningBoolOnSuccess(i);
无论如何它不会返回false?看起来不合逻辑。
为什么你不只是做:
bool someOk=false;
for(int i=0; i<10; i++){
if (funcReturningBoolOnSuccess(i)) {
someOk = true;
break;
}
}
很多更有效的:)
我知道这是不是原地的,但它更容易使用。
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
或者,因为布尔只接受0,1的值,你可以这样做:
someOk |= funcRetBoolOnSuc(x);
请注意,函数和'| ='运算符都没有表现出我们对假设的'|| ='运算符所期望的短路行为;即使'someOk'已经成立,'funcRetBoolOnSuccess'也会被调用。 –
只要回报是bool
,您可以使用|=
用于此目的(除非你想严格避免了第一次成功后,调用funcReturningBoolOnSuccess(i);
- 在这种情况下,你必须使用一些if
和break
或改变for
循环的条件)。
如果结果不是bool
的值,那么您可能需要将其转换为该值,因为|=
确实是按位运算。在C或任何基本类型C++可通过!!
简单特技转换为bool
(“梆梆”或“未未”) - 它使任何一个true
非零和零结果的false
,这是我们想要的。
我的猜测是'bool'的表示是实现定义的,所以使用'| ='可能无法正常工作? – eudoxos
我不明白为什么会导致问题。无论实际的二进制位模式是什么,“true”和“false”仍应该是两个常量值(并且可以根据标准中的第4.5节将其转换为整数)。虽然我并不知道任何具有“真”的实现是不是1,但在某些体系结构中,它可能是3,6或42。 –
将'bool'提升为'int'的定义很明确:true变为1.这与任何用于表示内部值的位模式无关。 –
你是不是要找的| = – doctorlove
不,'| ='是按位进行的。 – eudoxos
@eudoxos:除非您需要短路功能,否则| =工作原理相同。没有|| =或等价物。如果你经常需要它,你可以编写自己的小功能。 – PlasmaHH