Назначение ключевого слова C :

#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; теоретически это более эффективно.