逻辑 OR 运算符结果为 rvalue

Logical OR operator result as rvalue

提问人:Saurav Sahu 提问时间:12/20/2016 最后编辑:Saurav Sahu 更新时间:12/21/2016 访问量:91

问:

这段代码是我在做代码审查时发现的。这段代码中有什么隐藏的问题还是没问题?

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

编辑:我的一个打字错误(代替)造成了一些令人讨厌的混乱;我对此感到非常抱歉。myBoolAmyBool

实际上,要审查的代码是:

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

我建议的代码是:

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

code#2 IMO的优点:

  1. 更好的可读性
  2. 如果一开始是未确定的,则不会有未定义的行为。myBool
与 C++ 语言无关的 逻辑

评论

2赞 StoryTeller - Unslander Monica 12/20/2016
您的建议没有相同的含义。你完全被排除在外myBoolA
3赞 Some programmer dude 12/20/2016
您显示的两条线并不等效。
0赞 DeiDei 12/20/2016
好吧,第二个版本不使用 ,但最好不要尝试将所有内容都放在一行上。myBoolA
0赞 Some programmer dude 12/20/2016
不,你显示的第一行没有问题。你有问题吗?它会产生意想不到的结果吗?你的实际问题是什么?
0赞 StoryTeller - Unslander Monica 12/20/2016
您更新后的建议仍然会忽略且不等同。myBoolA

答:

1赞 Azodious 12/20/2016 #1

根据您后来的评论,

您可以按如下方式进行重构:

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

这将节省一个额外的分配操作。when 之前为 truemyBoolif

评论

0赞 Some programmer dude 12/20/2016
这不是第二个语句的唯一问题,因为它不会设置为 .myBoolfalse
8赞 Bathsheba 12/20/2016 #2

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

||是 C++ 中的一个排序点,因此即使右侧的表达式依赖于左侧(可能是对 or 的引用),行为也会被定义。oldStatemyBoolmyBoolA

您将其更改为

if( oldState == AS_PLAYING ) myBool = true;

实际上在功能上是不同的(例如,分配是不同的),所以不要把它改成那个。myBool

最后,请注意,如果过载,则可避免短路性质。因此,在重构代码时请务必检查这一点。||||

评论

1赞 KyleKW 12/20/2016
+1 表示实际回答问题,而不仅仅是指出错误。这应该是正确答案。
0赞 Saurav Sahu 12/20/2016
谢谢。匆忙中,我错误地输入了 .myBoolmyBoolA
0赞 StoryTeller - Unslander Monica 12/21/2016
@SauravSahu - 另请注意。如果实际上是一个更广泛的检查,你的建议总是会先于它。而原始代码会在不需要时跳过它。oldState == AS_PLAYING
1赞 instance 12/20/2016 #3

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

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

if 为 true 且为 false。 仍将为 true,但在您的版本中,它不会被设置。myBoolA( oldState == AS_PLAYING )myBool

编辑后

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

仅当 初始化为 时,这才适用。myBooltrue

评论

0赞 Saurav Sahu 12/21/2016
您的后期编辑是错误的。如果以前为 true,则变为 ,这不满足 。myBoolfalsemyBool = myBool || (oldState == AS_PLAYING);
0赞 instance 12/21/2016
我不记得我为什么这么说,因为自从提出实际问题以来,已经进行了如此多的编辑。我的回答是将 myBool 和 myBoolA 视为两个不同的 bool。