Когда были введенные в С++ "и" и "или" альтернативные токены?

Я только что прочитал эту приятную штуку от Reddit.

Они упоминают and и or как "Альтернативные токены" для && и ||

Я до сих пор не знал об этом. Конечно, все знают о di-graphs и tri-graphs, но and и or? С каких пор? Является ли это недавним дополнением к стандарту?

Я только что проверил его с помощью Visual С++ 2008, и он, похоже, не распознает их как что-либо иное, кроме синтаксической ошибки. Что происходит?

Ответ 1

MSVC поддерживает их как ключевые слова, только если вы используете параметр /Za для отключения расширений; это верно, по крайней мере, от VC7.1 (VS2003).

Вы можете получить их в качестве макросов, включив iso646.h.

Я предполагаю, что они полагают, что по умолчанию ключевые слова будут разбивать слишком много существующего кода (и я не удивлюсь, если они правы).

Это обсуждалось в вопросе пару недель назад где-то здесь, на SO, но я не могу получить SO search или Google, чтобы найти эту чертову вещь.

Ответ 2

Из стандарта С++ 11 2.6/ Alternative tokens:

  • Для некоторых операторов и пунктуаторов предусмотрены альтернативные представления токенов.
  • Во всех аспектах языка каждый альтернативный токен ведет себя одинаково, соответственно, как основной маркер, за исключением его орфографии. Набор альтернативных токенов определен в таблице 2.

Таблица 2 - Альтернативные жетоны

alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
   <%          {    |    and         &&   |    and_eq      &=
   %>          }    |    bitor       |    |    or_eq       |=
   <:          [    |    or          ||   |    xor_eq      ^=
   :>          ]    |    xor         ^    |    not         !
   %:          #    |    compl       ~    |    not_eq      !=
   %:%:        ##   |    bitand      &    |

Ответ 3

Чтобы ответить на вопрос:

Они были определены в первом стандарте С++.

Ответ 4

См. стандарт С++. Проект комитета № 2 свободно доступен по адресу ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf, хотя он не является авторитетным, устаревшим и частично неправильным в нескольких местах. В частности, в разделе 2.5 Альтернативные токены определены следующие значения:

Alternative Primary
<%          {
%>          }
<:          [
:>          ]
%:          #
%:%:        ##
and         &&
bitor       |
or          ||
xor         ^
compl       ~
bitand      &
and_eq      &=
or_eq       |=
xor_eq      ^=
not         !
not_eq      !=

Хотя честно, я никогда не видел ни одного из них когда-либо используемого, кроме and, or и not, и даже тогда это редко. Обратите внимание, что они НЕ допускаются по умолчанию в простом C-коде, только в С++. Если вы хотите использовать их в C, вам придется либо #define их самим как макросы, либо #include заголовок <iso646.h>, который определяет все вышеперечисленное, кроме <% >% <: :> %: %:%: в качестве макросов (см. раздел 7.9 стандарта C99).

Ответ 5

Вы можете быть удивлены, узнав о них:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

Список из Ключевые слова С++.

Я считаю, что последние версии GCC поддерживают эти ключевые слова.

Ответ 6

У компилятора GNU g++ они есть, но я не знаю о MS VC++.

Вы можете получить ту же функциональность, поместив ее в верхнюю часть вашего файла кода.

#define and &&
#define bitor |
#define or ||
#define xor ^
#define compl ~
#define bitand &
#define and_eq &=
#define or_eq ^=
#define xor_eq ^=
#define not !
#define not_eq !=

Хотя это довольно хакерски, это должно сработать.

Ответ 7

Хотя вопрос старый, я хотел бы предоставить ему более или менее полный ответ: Альтернативные токены уже были частью отозванного С++ 98 (ISO/IEC 14882: 1998, который, я считаю, был первым ISO для С++). Хотя это не доказательство само по себе (и у меня нет копии ISO для С++ 98), здесь ссылка - см. Раздел С++.

Как упоминалось в других ответах, компилятор MSVC нарушает [lex.digraph] раздел стандарта, если флаг /Za не указан.

Ответ 8

Они находятся в рабочем документе для нового стандарта С++, на странице 14: Стандарт С++