提问人:Saurav Sahu 提问时间:12/20/2016 最后编辑:Saurav Sahu 更新时间:12/21/2016 访问量:91
逻辑 OR 运算符结果为 rvalue
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
code#2 IMO的优点:
- 更好的可读性
- 如果一开始是未确定的,则不会有未定义的行为。
myBool
答:
1赞
Azodious
12/20/2016
#1
根据您后来的评论,
您可以按如下方式进行重构:
if(!myBool)
myBool = (oldState == AS_PLAYING);
这将节省一个额外的分配操作。when 之前为 truemyBool
if
评论
0赞
Some programmer dude
12/20/2016
这不是第二个语句的唯一问题,因为它不会设置为 .myBool
false
8赞
Bathsheba
12/20/2016
#2
myBool = myBoolA || ( oldState == AS_PLAYING );
绝对没问题。
||
是 C++ 中的一个排序点,因此即使右侧的表达式依赖于左侧(可能是对 or 的引用),行为也会被定义。oldState
myBool
myBoolA
您将其更改为
if( oldState == AS_PLAYING ) myBool = true;
实际上在功能上是不同的(例如,分配是不同的),所以不要把它改成那个。myBool
最后,请注意,如果过载,则可避免短路性质。因此,在重构代码时请务必检查这一点。||
||
评论
1赞
KyleKW
12/20/2016
+1 表示实际回答问题,而不仅仅是指出错误。这应该是正确答案。
0赞
Saurav Sahu
12/20/2016
谢谢。匆忙中,我错误地输入了 .myBool
myBoolA
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
仅当 初始化为 时,这才适用。myBool
true
评论
0赞
Saurav Sahu
12/21/2016
您的后期编辑是错误的。如果以前为 true,则变为 ,这不满足 。myBool
false
myBool = myBool || (oldState == AS_PLAYING);
0赞
instance
12/21/2016
我不记得我为什么这么说,因为自从提出实际问题以来,已经进行了如此多的编辑。我的回答是将 myBool 和 myBoolA 视为两个不同的 bool。
评论
myBoolA
myBoolA
myBoolA