C++ 关键字的用途:&= (a.k.a.'and_eq')
Purpose of the C++ keyword: &= (a.k.a. 'and_eq')
cppreference nor cplusplus, and nor Microsoft 网站均未提供 C++ 关键字 &= 的详细定义(a.k.a。and_eq),尽管这些例子对于新手来说似乎有点神秘。
但是 Lischner
的书 C++ In a Nutshell: A Desktop Quick Reference
提供了 following(第 291 页,2003 年):
The and_eq operator is an assignment operator that performs bitwise 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;
?
没有。 a &= b
是 a = a & b
的快捷方式。
此外,a = b
returns 分配给 a
的值。所以 result = a &= b
是
的缩写
a = a & b;
result = a;
这不是关键字,而是表达式运算符。在这里找到:https://en.cppreference.com/w/cpp/language/expressions
它是按位与运算符结合赋值运算符。在基本类型上,它对两个参数执行按位与,然后将结果分配给第一个参数。
uint32_t a = 0b00110101;
uint32_t b = 0b01101011;
a &= b;
//Equivalent: a = a & b;
assert(a == 0b00100001);
foo &= bar
是 foo = foo & bar
的缩写,表示内置类型。 但是,它是一个可以由用户定义的类型重新实现的运算符,所以它的语义可以为此改变。
&=
,所有其他 op=
内置运算符在 [expr.ass] 中描述为
The behavior of an expression of the form E1 op= E2
is equivalent to E1 = E1 op E2
except that E1
is evaluated only once. In +=
and -=
, E1
shall either have arithmetic type or be a pointer to a possibly cv-qualified completely-defined object type. In all other cases, E1
shall have arithmetic type.
因此,result= a &= b;
与
相同
result = (a = (a & b));
或文字:
store the result of bitwise and between a and b into a and result.
a = a & b;
和 a &= b;
之间有一个相关的区别。前者创建一个等于 a & b
的临时值并将该临时值分配给 a
。后者就地更新a
。
对于内置类型,这无关紧要:任何编译器都会将任一表达式优化为相同的机器语言指令。但是,如果您定义 class 并重载运算符,那么编写 a = a & b;
可能最终会创建一个临时对象,将一堆数据复制到其中,然后将其所有数据复制到其他地方。虽然有很多方法可以缓解这个问题,但 a &= b;
理论上效率更高。
cppreference nor cplusplus, and nor Microsoft 网站均未提供 C++ 关键字 &= 的详细定义(a.k.a。and_eq),尽管这些例子对于新手来说似乎有点神秘。
但是 Lischner
的书 C++ In a Nutshell: A Desktop Quick Reference
提供了 following(第 291 页,2003 年):
The and_eq operator is an assignment operator that performs bitwise 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;
?
没有。 a &= b
是 a = a & b
的快捷方式。
此外,a = b
returns 分配给 a
的值。所以 result = a &= b
是
a = a & b;
result = a;
这不是关键字,而是表达式运算符。在这里找到:https://en.cppreference.com/w/cpp/language/expressions
它是按位与运算符结合赋值运算符。在基本类型上,它对两个参数执行按位与,然后将结果分配给第一个参数。
uint32_t a = 0b00110101;
uint32_t b = 0b01101011;
a &= b;
//Equivalent: a = a & b;
assert(a == 0b00100001);
foo &= bar
是 foo = foo & bar
的缩写,表示内置类型。 但是,它是一个可以由用户定义的类型重新实现的运算符,所以它的语义可以为此改变。
&=
,所有其他 op=
内置运算符在 [expr.ass] 中描述为
The behavior of an expression of the form
E1 op= E2
is equivalent toE1 = E1 op E2
except thatE1
is evaluated only once. In+=
and-=
,E1
shall either have arithmetic type or be a pointer to a possibly cv-qualified completely-defined object type. In all other cases,E1
shall have arithmetic type.
因此,result= a &= b;
与
result = (a = (a & b));
或文字:
store the result of bitwise and between a and b into a and result.
a = a & b;
和 a &= b;
之间有一个相关的区别。前者创建一个等于 a & b
的临时值并将该临时值分配给 a
。后者就地更新a
。
对于内置类型,这无关紧要:任何编译器都会将任一表达式优化为相同的机器语言指令。但是,如果您定义 class 并重载运算符,那么编写 a = a & b;
可能最终会创建一个临时对象,将一堆数据复制到其中,然后将其所有数据复制到其他地方。虽然有很多方法可以缓解这个问题,但 a &= b;
理论上效率更高。