Когда в C ++ были введены альтернативные токены 'and' и 'or'? - PullRequest
37 голосов
/ 17 февраля 2009

Я только что прочитал хороший кусок от Reddit.

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

Я действительно не знал об этом до сих пор. Конечно, все знают о диграфах и триграфах , но and и or? С каких пор? Это недавнее дополнение к стандарту?

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

Ответы [ 8 ]

32 голосов
/ 17 февраля 2009

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

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

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

alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
   <%          {    |    and         &&   |    and_eq      &=
   %>          }    |    bitor       |    |    or_eq       |=
   <:          [    |    or          ||   |    xor_eq      ^=
   :>          ]    |    xor         ^    |    not         !
   %:          #    |    compl       ~    |    not_eq      !=
   %:%:        ##   |    bitand      &    |
23 голосов
/ 17 февраля 2009

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

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

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

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

10 голосов
/ 15 июля 2016

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

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

4 голосов
/ 17 февраля 2009

См. Стандарт C ++. Проект комитета № 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 ++. Если вы хотите использовать их в C, вам придется либо #define сделать их самостоятельно в качестве макроса, либо #include заголовок <iso646.h>, который определяет все вышеперечисленное, кроме <% >% <: :> %: %:%: в качестве макросов (см. Раздел 7.9 стандарта C99).

0 голосов
/ 19 июля 2017

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

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

0 голосов
/ 17 февраля 2009

В 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 !=

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

0 голосов
/ 17 февраля 2009

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

0 голосов
/ 17 февраля 2009

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

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

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

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

...