在以下情况下,由于&运算符会发生什么?
What happens due to & operator in the following case?
我知道,'&'是按位的,是获取变量内存地址的运算符。 在这种情况下,代码会发生什么? 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。
我想你已经明白了。
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 这里的 = 运算符有什么用法?
- unique_ptr < 0 或小于运算符做什么?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 是什么让一些命名函数/运算符与众不同?
- C++,()运算符重载,它的工作是什么
- 提供运算符+或运算符到双向迭代器有什么缺点吗?
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 在C++中,运算符 sizeof 返回什么数据类型?
- 运算符++();调用和++(*this)有什么区别?
- 第二个常量在运算符函数中做什么?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 当值传递给C++中的运算符重载函数时会发生什么
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在复制构造函数中放入什么 = 运算符重载
- 什么C++运算符在这里被重载了
- 当类作为参数传递给printf()时,要重载什么运算符
- 如果我想使用什么运算符" a = {x, y};"