Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是*和+;分别相当于&&;和| |关于布尔操作数?_C++_Boolean_Operators_Boolean Expression_Boolean Operations - Fatal编程技术网

C++ 是*和+;分别相当于&&;和| |关于布尔操作数?

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)时,结果似乎不同 我不确定哪些是正确的,

[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
操作数,它们几乎相同。但也有微妙的区别:

  • *
    +
    bool
    类型参数扩展为
    int
    类型

  • 表达式
    a | | b
    的类型是
    bool
    ,而
    a+b
    int
    &&
    *
    也一样

  • *
    +
    不是序列点,而
    &&
    |
    是序列点

  • *
    +
    没有短路,而
    &&
    |

  • 它们在运算符优先级表中占据非常不同的位置。因此,替代并非易事

  • <> L> >代码> A<代码> Boo> <代码>,<>代码> B/C++ >也是 Boo.<代码>,但未初始化,则定义了<代码> > A.B的行为,但<代码> A+B 未定义,因为 Boo.<代码>可以包含C++中的陷阱表示。对于
    &&
    *
    可以使用类似的表达式

  • 一个非常长的
    A+b+c+…
    链可能会溢出
    int
    类型,其行为尚未定义

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


    (此处不太相关,但值得注意:请注意,
    &&&
    |
    如果过载,将失去其短路特性)。

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

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


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

    @EdHeal:请在答案区域写下答案。由于它的独特性,人们对它的评价很高。从逻辑上讲,它们不是;)是的,“逻辑”很难解释。我只是简单地定义了这个术语。此外,溢出可能会导致从逻辑1到0的翻转。@LogicStuff:正式地说是一辆卡车装载了未定义的行为!掐那个。“失去他们的短路特性”有点让人困惑。过载的
    &&
    |
    不会短路,但这对内置版本没有影响,内置版本总是短路;我承认,在我试图让我的答案更全面的时候,我偷走了你的优先点。在我的答案中,请随意借用我的其他观点:你的答案往往比我的质量更高。@Bathsheba你的答案解释了与问题标题的区别,从长远来看,哪一点更重要?对于通过搜索引擎访问的访问者来说。在某种程度上,我在这里提出一个侧重点,即逻辑和算术运算符不能以混合匹配的方式使用。因为这就是OP一直在做的,这一点解释了他的不同之处。对其他人来说,其他六点更为相关。