C++ 是*和+;分别相当于&&;和| |关于布尔操作数?
[8]是一组布尔数。我试图计算一个布尔表达式,如下所示C++ 是*和+;分别相当于&&;和| |关于布尔操作数?,c++,boolean,operators,boolean-expression,boolean-operations,C++,Boolean,Operators,Boolean Expression,Boolean Operations,[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])); 表达式很长,但概念上并不复杂。唯一的错误是,当我将表达式中的*替换为&(在这两种情况下,我都需要逻辑AND)或将+替换为| |(需要逻辑or)时,结果似乎不同 我不确定哪些是正确的,
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]));
表达式很长,但概念上并不复杂。唯一的错误是,当我将表达式中的*替换为&(在这两种情况下,我都需要逻辑AND)或将+替换为| |(需要逻辑or)时,结果似乎不同
我不确定哪些是正确的,布尔运算符或乘法、加法等数学符号。更糟糕的是,没有给出任何错误,即编译器对两者都满意。哪一个更安全和正确?对于bool
操作数,它们几乎相同。但也有微妙的区别:
*
和+
将bool
类型参数扩展为int
类型a | | b
的类型是bool
,而a+b
是int
。&&
和*
也一样*
和+
不是序列点,而&&
和|
是序列点*
和+
没有短路,而&&
和|
是&&
和*
可以使用类似的表达式
A+b+c+…
链可能会溢出int
类型,其行为尚未定义a++*a++
是未定义的行为,但a++|a++
不是
(此处不太相关,但值得注意:请注意,
&&&
和|
如果过载,将失去其短路特性)。除了逻辑运算符中的短路(在此处没有区别)之外,解释行为变化的关键区别是
当您将*
替换为&
,或将+
替换为|
时,优先级顺序会发生变化:*
的优先级高于+
,但&
的优先级低于+
。这就是为什么您需要将表达式完全插入括号,以便强制执行所需的操作顺序,只将*
替换为&&
用
&&
和|
替换*
和|
将保持两个运算符的相对优先级相同,因此您将得到相同的结果。@EdHeal:请在答案区域写下答案。由于它的独特性,人们对它的评价很高。从逻辑上讲,它们不是;)是的,“逻辑”很难解释。我只是简单地定义了这个术语。此外,溢出可能会导致从逻辑1到0的翻转。@LogicStuff:正式地说是一辆卡车装载了未定义的行为!掐那个。“失去他们的短路特性”有点让人困惑。过载的&&
和|
不会短路,但这对内置版本没有影响,内置版本总是短路;我承认,在我试图让我的答案更全面的时候,我偷走了你的优先点。在我的答案中,请随意借用我的其他观点:你的答案往往比我的质量更高。@Bathsheba你的答案解释了与问题标题的区别,从长远来看,哪一点更重要?对于通过搜索引擎访问的访问者来说。在某种程度上,我在这里提出一个侧重点,即逻辑和算术运算符不能以混合匹配的方式使用。因为这就是OP一直在做的,这一点解释了他的不同之处。对其他人来说,其他六点更为相关。