#c #keyword
#c #ключевое слово
Вопрос:
Ни cppreference, ни cplusplus, ни веб-сайты Microsoft не предоставили подробного определения ключевого слова C amp;= (он же and_eq), несмотря на примеры, которые кажутся немного загадочными для новичка.
Тем не менее, в книге C In a Nutshell: A Desktop Quick Reference
by Lischner
указано следующее (стр. 291, 2003):
Оператор and_eq — это оператор присваивания, который выполняет побитовое и.
Цитирую пример из Microsoft:
#include <iostream>
#include <iso646.h>
int main( )
{
using namespace std;
int a = 3, b = 2, resu<
result= a amp;= b;
cout << result << endl;
}
выдает 2
.
Соответственно, не могли бы вы, пожалуйста, сказать мне, является ли amp;= ярлыком для объединенных назначений (если такая вещь существует?), Например: result = a = b;
?
Комментарии:
1.
amp;=
обсуждается на cppreference.com в разделе, посвященном операторам присваивания . Это оператор «побитового И присваивания», см. Раздел «Встроенное составное присваивание» на той же странице
Ответ №1:
Нет. a amp;= b
является ярлыком для a = a amp; b
.
Кроме того, a = b
возвращает значение, которому было присвоено a
. So result = a amp;= b
— сокращение от:
a = a amp; b;
result = a;
Комментарии:
1. Если
operator amp;=
только тип не был перегружен для типаa
😉 Тип находитсяint
здесь, поэтому он не мог быть перегружен. Но для не встроенных типов это могло бы иметь.
Ответ №2:
amp;=
, и все другие op=
встроенные операторы описаны в [expr.ass]7 как
Поведение выражения формы
E1 op= E2
эквивалентноE1 = E1 op E2
за исключением того, чтоE1
вычисляется только один раз. В=
и-=
,E1
должно либо иметь арифметический тип, либо быть указателем на, возможно, cv-квалифицированный, полностью определенный тип объекта. Во всех остальных случаяхE1
должно иметь арифметический тип.
Итак, result= a amp;= b;
это то же самое, что
result = (a = (a amp; b));
или текстуально:
сохраните результат побитового преобразования между a и b в a и result.
Ответ №3:
Это не ключевое слово, это оператор выражения. Найдено здесь: https://en.cppreference.com/w/cpp/language/expressions
Это побитовый оператор AND в сочетании с оператором присваивания. Для примитивных типов он выполняет побитовое преобразование и для двух параметров, а затем присваивает результат первому параметру.
uint32_t a = 0b00110101;
uint32_t b = 0b01101011;
a amp;= b;
//Equivalent: a = a amp; b;
assert(a == 0b00100001);
Комментарии:
1. Итак, and_eq — это ключевое слово, а amp;= — оператор, учитывающий следующее: en.cppreference.com/w/cpp/keyword/and_eq ?
2. @KutalmisB
and_eq
— это ключевое слово,amp;=
это оператор.
Ответ №4:
foo amp;= bar
является сокращением для foo = foo amp; bar
, для встроенных типов. Но это оператор, который может быть переопределен пользовательскими типами, поэтому его семантика может быть изменена для этого.
Ответ №5:
Между и есть одно существенное различие a = a amp; b;
a amp;= b;
. Первый создает временное значение, равное a amp; b
и присваивает этому временному значению a
. Последнее обновляется a
на месте.
Для встроенных типов это не имеет значения: любой компилятор просто оптимизирует любое выражение для одной и той же инструкции машинного языка. Однако, если вы определяете класс и перегружаете операторы, запись a = a amp; b;
может закончиться созданием временного объекта, копированием в него кучи данных, а затем копированием всех его данных куда-то еще. Хотя существуют способы решения этой проблемы, a amp;= b;
теоретически это более эффективно.