逻辑OR运算符结果为rvalue

Sau*_*ahu 1 c++ language-agnostic logic

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

myBool = myBoolA || ( oldState == AS_PLAYING );   //code #1
Run Code Online (Sandbox Code Playgroud)

编辑:一个打字错误(myBoolA取代myBool)由我创造了一些令人讨厌的混乱; 我很抱歉.

实际上要审查的代码是:

myBool = myBool || ( oldState == AS_PLAYING );   //code #1, not myBoolA
Run Code Online (Sandbox Code Playgroud)

我建议的代码是:

if( oldState == AS_PLAYING ) myBool = true;   //code #2
Run Code Online (Sandbox Code Playgroud)

代码#2 IMO的优点:

  1. 更好的可读性
  2. 如果myBool是未初始化的,则不会有未定义的行为.

Bat*_*eba 8

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

||是C++中的排序点,因此即使右侧的表达式取决于左侧(可能oldState是对or 的引用),也会定义行为.myBoolmyBoolA

您的建议是将其更改为

if( oldState == AS_PLAYING ) myBool = true;

实际上在功能上myBool是不同的(例如,赋值是不同的),所以不要将其更改为.

最后,请注意,||如果||过载,则可以避免短路特性.所以在重构代码时一定要检查一下.