Назначение ключевого слова C ++: & = (a.k.a. 'and_eq') - PullRequest
0 голосов
/ 22 апреля 2019

Ни cppreference , ни cplusplus , ни Microsoft веб-сайты не предоставили подробного определения ключевого слова C ++ & = (иначе * 1009)* and_eq ), несмотря на примеры, которые кажутся немного загадочными для новичка.

И все же книга C++ In a Nutshell: A Desktop Quick Reference Lischner предоставила после (стр. 291,2003):

Оператор and_eq является оператором присваивания, который выполняет побитовое и.

Цитирование примера из 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;?

Ответы [ 5 ]

4 голосов
/ 22 апреля 2019

Нет. a &= b является ярлыком для a = a & b.

Кроме того, a = b возвращает значение, которое было присвоено a. Так что result = a &= b - это сокращение от:

a = a & b;
result = a;
3 голосов
/ 22 апреля 2019

&= и все остальные 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 и result.

2 голосов
/ 22 апреля 2019

foo &= bar - это сокращение от foo = foo & bar для встроенных типов. Но , это оператор, который может быть переопределён пользовательскими типами, поэтому его семантика может быть изменена для таких.

2 голосов
/ 22 апреля 2019

Это не ключевое слово, это оператор выражения. Найдено здесь: https://en.cppreference.com/w/cpp/language/expressions

Это побитовый оператор AND в сочетании с оператором присваивания. В примитивных типах он выполняет побитовое И для двух параметров, а затем присваивает результат первому параметру.

uint32_t a = 0b00110101;
uint32_t b = 0b01101011;

a &= b;
//Equivalent: a = a & b;
assert(a == 0b00100001);
1 голос
/ 22 апреля 2019

Есть одно существенное различие между a = a & b; и a &= b;. Первый создает временное значение, равное a & b, и присваивает это временное значение a. Последние обновления a на месте.

Для встроенных типов это не имеет значения: любой компилятор просто оптимизирует любое выражение для одной и той же инструкции машинного языка. Однако если вы определяете класс и перегружаете операторы, написание a = a & b; может в конечном итоге создать временный объект, скопировать в него кучу данных и затем скопировать все его данные в другое место. Хотя существуют способы смягчения этой проблемы, теоретически a &= b; более эффективен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...