逻辑或运算符结果作为右值

Logical OR operator result as rvalue

这段代码是我在进行代码审查时发现的。这段代码是不是有什么隐藏的问题还是刚刚好?

myBool = myBoolA || ( oldState == AS_PLAYING );   //code #1

编辑: 我的一个打字错误(myBoolA 代替了 myBool)造成了一些严重的混乱;我真的很抱歉。

实际要审核的代码是:

myBool = myBool || ( oldState == AS_PLAYING );   //code #1, not myBoolA

我建议的代码是:

if( oldState == AS_PLAYING ) myBool = true;   //code #2

代码#2 IMO 的优势:

  1. 更好的可读性
  2. 如果 myBool 一开始是未初始化的,就不会有未定义的行为。

根据您稍后的评论,

您可以重构如下:

if(!myBool)
    myBool =  (oldState == AS_PLAYING);

这将节省一次额外的赋值操作。当 myBoolif

之前为真

myBool = myBoolA || ( oldState == AS_PLAYING ); 绝对没问题。

|| 是 C++ 中的一个排序点,所以即使右边的表达式依赖于左边(也许 oldState 是一个 referencemyBoolmyBoolA),将定义行为。

您建议将此更改为

if( oldState == AS_PLAYING ) myBool = true;

实际上在功能上是不同的(例如 myBool 的赋值是不同的),所以不要将其更改为那样。

最后,请注意,如果 || 过载,则 || 的短路特性将被避免。所以在重构代码时一定要检查一下。

myBool = myBoolA || ( oldState == AS_PLAYING ); //代码#1 似乎是正确的版本。

您的版本不等同于此。如何?参见

如果 myBoolA 为真且 ( oldState == AS_PLAYING ) 为假。 myBool 仍然是 true,但在您的版本中,它不会被设置。

编辑后

if( oldState != AS_PLAYING )  myBool = false;    //code #2 more readable IMO

仅当 myBool 初始化为 true 时才可以。