我在进行代码审查时发现了这段代码。这段代码中是否有任何隐藏的问题或它是否正常?
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
未初始化,则不会有未定义的行为。答案 0 :(得分:8)
myBool = myBoolA || ( oldState == AS_PLAYING );
绝对没问题。
||
是C ++中的一个排序点,所以即使右侧的表达式取决于左侧(也许oldState
是引用到{ {1}}或myBool
),将定义行为。
您建议将此更改为
myBoolA
实际上在功能上有所不同(例如if( oldState == AS_PLAYING ) myBool = true;
的分配不同),所以不要将其更改为。
最后,请注意,如果myBool
超载,则||
的短路性质会被消除。因此,在重构代码时请务必检查。
答案 1 :(得分:1)
根据您之后的评论,
您可以按以下方式重构:
if(!myBool)
myBool = (oldState == AS_PLAYING);
这将保存一个额外的赋值操作。在myBool
if
为真时
答案 2 :(得分:1)
myBool = myBoolA || ( oldState == AS_PLAYING );
//代码#1
似乎是正确的版本。
您的版本不等于此。怎么样?参见
如果myBoolA
为真且( oldState == AS_PLAYING )
为假。 <{1}}仍然是真的,但在你的版本中,它不会被设置。
编辑后
myBool
仅当使用if( oldState != AS_PLAYING ) myBool = false; //code #2 more readable IMO
初始化myBool
时才会有效。