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;
所示相同
.
它将始终执行,因为短路不适用于按位运算(仅适用于逻辑运算,如&&和||).
请注意,这种误解会导致令人讨厌的错误 - 开发人员会认为存在短路但没有错误,并且所有表达式部分始终都会执行并且会改变程序逻辑.
它总是被执行.请注意,这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)
简而言之,避免使用|=和&=使用布尔变量.