逻辑或运算符结果作为右值
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 的优势:
- 更好的可读性
- 如果
myBool
一开始是未初始化的,就不会有未定义的行为。
根据您稍后的评论,
您可以重构如下:
if(!myBool)
myBool = (oldState == AS_PLAYING);
这将节省一次额外的赋值操作。当 myBool
在 if
之前为真
myBool = myBoolA || ( oldState == AS_PLAYING );
绝对没问题。
||
是 C++ 中的一个排序点,所以即使右边的表达式依赖于左边(也许 oldState
是一个 reference 到 myBool
或 myBoolA
),将定义行为。
您建议将此更改为
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
时才可以。
这段代码是我在进行代码审查时发现的。这段代码是不是有什么隐藏的问题还是刚刚好?
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 的优势:
- 更好的可读性
- 如果
myBool
一开始是未初始化的,就不会有未定义的行为。
根据您稍后的评论,
您可以重构如下:
if(!myBool)
myBool = (oldState == AS_PLAYING);
这将节省一次额外的赋值操作。当 myBool
在 if
myBool = myBoolA || ( oldState == AS_PLAYING );
绝对没问题。
||
是 C++ 中的一个排序点,所以即使右边的表达式依赖于左边(也许 oldState
是一个 reference 到 myBool
或 myBoolA
),将定义行为。
您建议将此更改为
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
时才可以。