繁体   English   中英

在以下情况下,由于&运算符会发生什么?

[英]What happens due to & operator in the following case?

我知道“&”是按位运算符,也是一种获取变量的内存地址的运算符。 在这种情况下,代码会怎样? res = res&(a [i] <[a [i + 1]]);

如果按位和,据我所知,还检查了第二个条件,但是如果我使用逻辑而不是它怎么办,会不一样吗?

由于第一部分(例如)为false,第二部分被检查为true,但是res仍然为false。

(在这种情况下)使用逻辑与此相同吗? 还是在这种情况下还有其他用途(&运算符)?

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

(对不起,英语不好)

如果按位和,据我所知,还检查了第二个条件,但是如果我使用逻辑而不是它怎么办,会不一样吗?

否。布尔值和(写为&&and )具有短路评估-如果左侧部分为假,则完全不评估右侧部分。 这样可以编写如下代码:

if( pointer != nullptr && pointer->value > 100 ) ...

如果不是短路评估,则该代码将具有UB。 例如此代码:

if( pointer != nullptr & pointer->value > 100 ) ...

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

(在这种情况下)使用逻辑与此相同吗? 还是在这种情况下还有其他用途(&运算符)?

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

res = res && (a[i] < a[i + 1]);

而且这也会造成短路,并且编译器甚至可能足够聪明,可以停止循环,尽管我对此表示怀疑,并且无论如何都应明确表示:

bool res = true;
for(int i = 0; res && i < pos; i++)
    res = a[i] < a[i + 1];

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

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

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

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

res && 1将返回true

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

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

因此,对于按位运算,由于未定义a [4],res的值不可预测。

现在让我们考虑逻辑与运算。 对于逻辑和,for循环内的表达式将一次为a [i] <a [i + 1]生成错误的布尔值,因为数组a [] = {1,3,4,2}。 这里4> 2而不是4 <2。 因此,它将生成错误的布尔值,并且您的整个响应都将为false,因为您知道逻辑,如果其中一个操作数为false,最终将为0。

我想你已经明白了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM