C++关键字的用途:&=(又称"and_eq")

Purpose of the C++ keyword: &= (a.k.a. 'and_eq')

本文关键字:又称 and eq 关键字 C++      更新时间:2023-10-16

cppreference和cplusplus,以及Microsoft网站都没有提供C++关键字&=(又名and_eq(的详细定义,尽管对于新手来说似乎有点神秘的例子。

然而,Lischner C++ In a Nutshell: A Desktop Quick Reference的书提供了以下内容(第291页,2003年(:

and_eq运算符是执行按位 and 的赋值运算符。

引用Microsoft的例子:

#include <iostream>
#include <iso646.h>
int main( )
{
   using namespace std;
   int a = 3, b = 2, result;
   result= a &= b;
   cout << result << endl;
}

产量2 .

因此,您能否告诉我 &= 是否是级联赋值的快捷方式(如果存在这样的事情result = a = b;

No. a &= ba = a & b的快捷方式。

此外,a = b返回分配给 a 的值。所以result = a &= b是:

a = a & b;
result = a;

&= ,所有其他内置运算符op=在 [expr.ass]\7 中描述为

表单 E1 op= E2 的表达式的行为等效于E1 = E1 op E2,只是只计算一次E1。在+=-=中,E1要么具有算术类型,要么是指向可能符合 cv 的完全定义的对象类型的指针。在所有其他情况下,E1应具有算术类型。

所以,result= a &= b;

result = (a = (a & b));

或文本:

将按位和 A 和 B 之间的结果存储为 A 和 结果。

它不是一个关键字,而是一个表达式运算符。在这里找到: https://en.cppreference.com/w/cpp/language/expressions

它是与赋值运算符组合的按位 AND 运算符。在基元类型上,它对两个参数执行按位 AND,然后将结果分配给第一个参数。

uint32_t a = 0b00110101;
uint32_t b = 0b01101011;
a &= b;
//Equivalent: a = a & b;
assert(a == 0b00100001);

foo &= barfoo = foo & bar的缩写,用于内置类型。但是,它是一个可以通过用户定义类型重新实现的运算符,因此可以为此更改其语义。

a = a & b;a &= b; 之间有一个相关的区别。 前者创建一个临时等于a & b并将该临时值分配给a。 后者更新a到位。

对于内置类型,这并不重要:任何编译器都会将任一表达式优化为相同的机器语言指令。 但是,如果定义一个类并重载运算符,则编写a = a & b;最终可能会创建一个临时对象,向其复制一堆数据,然后将其所有数据复制到其他地方。 虽然有一些方法可以缓解这个问题,但a &= b;理论上更有效。