2013-07-11 48 views
1

在这条线上,是否有像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),但它不是很漂亮)。

+0

你是不是要找的| = – doctorlove

+0

不,'| ='是按位进行的。 – eudoxos

+0

@eudoxos:除非您需要短路功能,否则| =工作原理相同。没有|| =或等价物。如果你经常需要它,你可以编写自己的小功能。 – PlasmaHH

回答

3

答案很简短:不,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; 
    } 
} 

很多更有效的:)

+0

因此,只要'break'例子的目的是真的? – MMM

+0

我想循环应该在函数返回“true”时立即终止 - 不需要检查其余的值。 – Werolik

+0

划线部分是否与此答案不可分?如果不是,那就删除它。如果任何人真的需要看到它,编辑历史将保留它的副本。如果让它看起来很重要,你能否用文字解释它有什么问题,而不是仅仅把它交出来?我的意思不清楚。 –

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 

或者,因为布尔只接受0,1的值,你可以这样做:

someOk |= funcRetBoolOnSuc(x); 
+0

请注意,函数和'| ='运算符都没有表现出我们对假设的'|| ='运算符所期望的短路行为;即使'someOk'已经成立,'funcRetBoolOnSuccess'也会被调用。 –

1

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

如果结果不是bool的值,那么您可能需要将其转换为该值,因为|=确实是按位运算。在C或任何基本类型C++可通过!!简单特技转换为bool(“梆梆”或“未未”) - 它使任何一个true非零和零结果的false,这是我们想要的。

+0

我的猜测是'bool'的表示是实现定义的,所以使用'| ='可能无法正常工作? – eudoxos

+0

我不明白为什么会导致问题。无论实际的二进制位模式是什么,“true”和“false”仍应该是两个常量值(并且可以根据标准中的第4.5节将其转换为整数)。虽然我并不知道任何具有“真”的实现是不是1,但在某些体系结构中,它可能是3,6或42。 –

+0

将'bool'提升为'int'的定义很明确:true变为1.这与任何用于表示内部值的位模式无关。 –