【问题标题】:Are * and + equivalent to, respectively, && and || on Boolean operands?* 和 + 分别等同于 && 和 ||在布尔操作数上?
【发布时间】:2017-06-05 07:18:45
【问题描述】:

a[8] 是一个布尔数组。我正在尝试计算如下所示的布尔表达式。

bool a[8];
.....
bool result=a[0]*(a[3]+a[6]*(a[4]+a[7]*a[5]))+a[1]*(a[6]*a[3]+a[4]+a[7]*a[5])+a[2]*(a[5]+a[7]*(a[4]+a[6]*a[3]));

表达式很长,但在概念上并不复杂。唯一的错误是,当我将表达式中的 * 替换为 && (在这两种情况下我都期望逻辑与)或将 + 替换为 || 时,结果似乎不同。 (期望逻辑或)。

我不确定哪些是正确的,布尔运算符或乘法、加法等的数学符号。更糟糕的是,没有一个给出任何错误,即编译器对两者都很满意。哪一种更安全、更正确?

【问题讨论】:

  • @EdHeal:请在答题区写下答案。
  • 因其引人入胜的独特性而受到赞誉。

标签: c++ boolean operators boolean-expression boolean-operations


【解决方案1】:

对于bool 操作数,它们几乎相同。但也有细微的差别:

  1. *+ 会将 bool 类型参数扩展为 int 类型。

  2. 表达式a || b 的类型是bool,而a + bint&&* 同上。

  3. *+ 不是排序点,而 &&|| 是。

  4. *+ 没有短路,而&&|| 是。

  5. 它们在运算符优先级表中占据非常不同的位置。所以替换并不简单。

  6. 1234563 /em> 因为bool 可以包含 C++ 中的陷阱表示。 &&* 可以变出类似的表达方式。
  7. 很长的a + b + c + ... 链可能会溢出int 类型,其行为未定义。

(3) 表示a++ * a++ 是未定义的行为,但a++ || a++ 不是。

(此处不相关但值得注意:请注意,&&|| 在过载时会失去其短路特性。

【讨论】:

  • 从逻辑上讲他们不是;)
  • 是的,“逻辑”很难解释。我只是简单地把这个词固定了。
  • 另外,溢出可能会导致从逻辑 1 翻转到 0。
  • @LogicStuff:形式上是一大堆未定义的行为!捏那个。
  • “失去短路特性”有点令人困惑。重载的&&|| 不会短路,但这对始终短路的内置版本没有影响。
【解决方案2】:

除了逻辑运算符中的短路(这里没有区别)之外,解释行为变化的关键区别是operator precedence

当您将* 替换为&&,或将+ 替换为|| 时,优先顺序会发生变化:* 的优先级高于 +,但@987654328 @ 的优先级低于 +。这就是为什么您需要将表达式完全括起来以强制执行所需的操作顺序,仅将 * 替换为 &&

*+ 替换为&&|| 将保持两个运算符的相对优先级相同,因此您最终会得到相同的结果。

【讨论】:

  • 赞成;我承认在我试图让我的答案全面时偷了你的优先点。
  • 请在我的回答中随意借用我的其他观点:您的回答最终往往比我的质量更好。
  • @Bathsheba 您的回答解释了与问题标题的区别,从长远来看,这对于通过搜索引擎命中的访问者来说更为重要。在某种程度上,我在这里提出一个观点,即逻辑和算术运算符不能以混合搭配的方式使用。由于这就是 OP 一直在做的事情,这一点解释了他的差异。对于其他人来说,其他六点更相关。
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 2013-06-13
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多