我知道,'&‘是按位表示的,也是获取变量的内存地址的操作符。在这种情况下,代码会发生什么?res = res & (ai<[ai+1]);
如果它是按位的,而且据我所知,第二个条件也会被检查,但是如果我用逻辑来代替它,它会不会还是一样的呢?
由于第一部分是假的,第二部分被检查成真,但仍是假的。
在这种情况下,使用逻辑和对此是否是相同的?或者它对这种情况有其他的用途(&操作员)?
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]);(抱歉英语不太好)
发布于 2019-07-25 17:05:14
如果它是按位的,而且据我所知,第二个条件也会被检查,但是如果我用逻辑来代替它,它会不会还是一样的呢?
不是的。布尔值和(写为&&或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];这也是一样的,但是更干净,更高效。
无论如何,当您需要逻辑或布尔值时,您应该使用逻辑或布尔值来明确您的意图,并避免意外的意外。
发布于 2019-07-25 17:14:15
除了短路问题外,如果res == 2:
res & 1将返回0,这将被解释为false。
res && 1将返回true。
发布于 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。
我想你已经搞定了。
https://stackoverflow.com/questions/57206839
复制相似问题