什么时候是bool的右手表达a | = mayRun(); 被执行?

Jan*_*Jan 1 c++ compiler-construction compound-assignment

假设代码片段

bool a;
a = true;
a |= mayRun();

a = false;
a |= mayRun();
Run Code Online (Sandbox Code Playgroud)

在哪种情况下mayRun()被执行?

所有解释都告诉我,这 a |= b; 相当于 a = a | b;

但它不能与示例arr[i++] |= b; 所示相同 .

sha*_*oth 7

它将始终执行,因为短路不适用于按位运算(仅适用于逻辑运算,如&&||).

请注意,这种误解会导致令人讨厌的错误 - 开发人员会认为存在短路但没有错误,并且所有表达式部分始终都会执行并且会改变程序逻辑.


Rei*_*ica 5

它总是被执行.请注意,这a |= b确实是a = a | b(仅评估a一次)的简写.特别是,它不是简写a = a || b.

这意味着它不提供布尔运算符的短路行为,因此b始终会对其进行求值.

使用这些带bool变量的速记赋值形式是危险的,正是因为语义不明显.&=实际上甚至更糟.比较一下:

int two() { return 2; }

int main()
{
  bool b = true;
  b = b && two();
  assert(b);  //OK
}
Run Code Online (Sandbox Code Playgroud)

有了这个:

int two() { return 2; }

int main()
{
  bool b = true;
  b &= two();
  assert(b);  //FAILS!!
  // b &= two(); was actually b = 1 & 2, which is 0 !
}
Run Code Online (Sandbox Code Playgroud)

简而言之,避免使用|=&=使用布尔变量.