[英]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.