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

What happens due to & operator in the following case?

本文关键字:什么 运算符 情况下 由于      更新时间:2023-10-16

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

如果它是按位的,并且据我所知,还检查了第二个条件, 但是如果我使用逻辑而不是它,它不是仍然是一样的吗?

由于第一部分是(说)假的,第二部分被检查成真,但 res 仍然是假的。

在这种情况下,使用逻辑和为此是否相同?或者在这种情况下它还有其他用途(和运算符)?

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。

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

现在让我们考虑一下逻辑 AND 操作。对于逻辑和 for 循环中的表达式将一次为 a[i] <a[i+1]>2 不是 4<2。因此,它将生成错误的布尔值,并且您的整个响应将是错误的,因为您知道逻辑,并且如果其中一个操作数为假,则最终将为 0。

我想你已经明白了。