我假设a、b 和c 是bool。
让我们画一些真值表:
| a | !a | a==1 | a==0 |
| 0 | 1 | 0 | 1 |
| 1 | 0 | 1 | 0 |
如您所见,a 和 a==1 是等价的,!a 和 a==0 也是等价的,所以我们可以将(a==0 && b==0)xor(c==1) 重写为(!a && !b) xor c。
现在还有一些真值表:
| a | b | a xor b | a != b |
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 |
所以a!=b等价于a xor b,所以我们可以将(!a && !b) xor c重写为(!a && !b)!=c。如您所见,您的解决方案是完全等效的,只是用不同的“符号”编写。
UPD:忘了说。教授的解决方案看起来完全那样是有原因的。
教授的解决方案比较惯用。虽然您的解决方案在技术上是正确的,但它不是惯用的 C++ 代码。
第一个小问题是类型的使用。当您将布尔值与数字进行比较或使用xor 时,您的解决方案依赖于int 和bool 之间的转换,这也是作用于ints 的“按位异或”运算符。在现代 C++ 中,使用正确类型的值而不依赖于此类转换更受赞赏,因为它们有时不太清楚且难以推理。对于bool,这些值分别是true 和false,而不是1 和0。 != 也比 xor 更合适,因为虽然从技术上讲 bools 存储为数字,但从语义上讲,您没有任何数字,只有逻辑值。
第二个问题也是关于惯用语。它就在这里:a == 0。将布尔表达式与布尔常量进行比较并不是一种好的做法。如您所知,a == true 完全等同于a,而a == false 只是!a 或not a(我更喜欢后者)。要了解这种比较不好的原因,只需比较两个代码 sn-ps 并做出决定,这更清楚:
if (str.empty() == false) { ... }
对
if (not str.empty()) { ... }