所以这更像是一个理论性问题。C++和(间接)基于它的语言(如Java、C#和PHP)都有用于将大多数二元运算符的结果分配给第一个操作数的快捷方式运算符。
a += 3; // for a = a + 3
a *= 3; // for a = a * 3;
a <<= 3; // for a = a << 3;
但是当我想要切换一个布尔表达式时,我总是发现自己写的类似于:
a = !a;
当 a
是一个长表达式时,这很令人烦恼。
this.dataSource.trackedObject.currentValue.booleanFlag =
!this.dataSource.trackedObject.currentValue.booleanFlag;
(是的,我知道迪米特定律)。
所以我在想,有没有一种语言有一元布尔开关运算符,可以让我缩写a = !a
而不需要重复表达式a
,例如:
!=a;
// or
a!!;
假设我们的语言有适当的布尔类型(例如 C++ 中的 bool 类型),并且 a 是该类型(因此不是 C 风格的 int a = TRUE)。如果您能找到有文献来源的话,我也很想了解例如 C++ 设计者在布尔类型成为内置类型时是否考虑添加这样的运算符,以及他们为什么决定不这样做。
(注:我知道有些人认为赋值不应使用 = ,并且 ++ 和 += 不是有用的运算符而是设计缺陷;让我们假设我对它们感到满意,并专注于为什么它们不能扩展到布尔类型)。
void Flip(bool& Flag) { Flag=!Flag; }
可以缩短你的长表达式。 - harperthis.dataSource.trackedObject.currentValue.booleanFlag ^= 1;
- KamilCuk^=true
,而我个人更喜欢用*= -1
,因为我觉得它更容易理解。 - CompuChip