逻辑OR运算符结果为右值

时间:2016-12-20 12:25:18

标签: c++ language-agnostic logic

我在进行代码审查时发现了这段代码。这段代码中是否有任何隐藏的问题或它是否正常?

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未初始化,则不会有未定义的行为。

3 个答案:

答案 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时才会有效。

相关问题