首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在下面的情况下,由于&操作符会发生什么?

在下面的情况下,由于&操作符会发生什么?
EN

Stack Overflow用户
提问于 2019-07-25 16:53:09
回答 3查看 72关注 0票数 0

我知道,'&‘是按位表示的,也是获取变量的内存地址的操作符。在这种情况下,代码会发生什么?res = res & (ai<[ai+1]);

如果它是按位的,而且据我所知,第二个条件也会被检查,但是如果我用逻辑来代替它,它会不会还是一样的呢?

由于第一部分是假的,第二部分被检查成真,但仍是假的。

在这种情况下,使用逻辑和对此是否是相同的?或者它对这种情况有其他的用途(&操作员)?

代码语言:javascript
复制
int a[] {1,3,4,2};
int pos = 3;
bool res = true;
    for(int i = 0; i < pos; i++)
        res &= (a[i] < a[i + 1]);

(抱歉英语不太好)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-25 17:05:14

如果它是按位的,而且据我所知,第二个条件也会被检查,但是如果我用逻辑来代替它,它会不会还是一样的呢?

不是的。布尔值和(写为&&and)具有短路评估--如果左部分为假,则根本不计算右部分。这允许编写如下代码:

代码语言:javascript
复制
if( pointer != nullptr && pointer->value > 100 ) ...

如果不是短路评估,此代码将有UB。例如,这段代码:

代码语言:javascript
复制
if( pointer != nullptr & pointer->value > 100 ) ...

pointer等于nullptr时,具有未定义的行为

在这种情况下,使用逻辑和对此是否是相同的?或者它对这种情况有其他的用途(&操作员)?

您不能这样做,因为在&&=中没有C++运算符。你可以写:

代码语言:javascript
复制
res = res && (a[i] < a[i + 1]);

这也会有短路,编译器甚至可能足够聪明地停止循环,尽管我怀疑它应该被明确地表达出来:

代码语言:javascript
复制
bool res = true;
for(int i = 0; res && i < pos; i++)
    res = a[i] < a[i + 1];

这也是一样的,但是更干净,更高效。

无论如何,当您需要逻辑或布尔值时,您应该使用逻辑或布尔值来明确您的意图,并避免意外的意外。

票数 0
EN

Stack Overflow用户

发布于 2019-07-25 17:14:15

除了短路问题外,如果res == 2

res & 1将返回0,这将被解释为false

res && 1将返回true

票数 0
EN

Stack Overflow用户

发布于 2019-07-25 17:43:04

你的问题还不清楚。好吧,让我们深入研究你的代码。

你给出的代码非常清楚。您正在按位执行,每次执行pos(3)次。对于每一个比较ai和ai+1的循环,请注意,对于最后一个循环,我的意思是当变量i变为3时,i+1将为4,而数组a[]没有a4。它只有最后一个具有索引3的元素。

因此,对于按位和操作,res的值是不可预测的,因为没有定义a4。

现在让我们考虑逻辑和操作。对于逻辑和表达式,For循环中的表达式将为ai < ai+1生成一个假布尔值,作为数组a[] = {1,3,4,2}。在这里,4>2不是4<2,因此它将生成假布尔值,您的整个响应将为false‘,因为您知道逻辑,如果其中一个操作数为false,最终将为0。

我想你已经搞定了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57206839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档