当前位置:  开发笔记 > 编程语言 > 正文

*和+分别等于&&和|| 在布尔操作数上?

如何解决《*和+分别等于&&和||在布尔操作数上?》经验,为你挑选了2个好方法。

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]));

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

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



1> Bathsheba..:

他们几乎为同一bool操作数.但是有一些微妙的差异:

    *并将类型的类型参数+加宽.boolint

    类型表达的a || bbool,而a + bint.同上&&*.

    *并且+不是排序点,而是&&||.

    *并且+没有短路,&&而且||是.

    它们在运算符优先级表中占据非常不同的位置.因此替换不是直截了当的.

    如果abool,并且b也是一个bool但不那么初始化的行为a || b被定义,但a + b未定义由于bool 可以包含在C++陷阱表示.类似的表达可以用来&&*.

    一个很长的链a + b + c + ...可以溢出int类型,其行为是未定义的.

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

(这里并未真正相关,但值得注意的是:注意,&&||,如果他们超载失去他们的短路属性).



2> dasblinkenli..:

除了逻辑运算符中的短路,这在这里没有区别之外,解释行为变化的关键区别在于运算符优先级.

当您更换*使用&&,或+||,的优先顺序有所不同:*具有较高的比优先级+,但&&具有较低的比优先级+.这就是为什么你需要完全括起你的表达式,以强制所谓的操作顺序,只需*替换为&&.

更换两个*+&&||将保留两家运营商相同的相对优先级,所以你最终会得到相同的结果.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有