Когда в C++ появились альтернативные токены «и» и «или»?

StackOverflow https://stackoverflow.com/questions/555505

Вопрос

Я только что прочитал это хорошая штука из Реддита.

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Из стандарта 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      &    |

Собственно, чтобы ответить на вопрос:

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

См. стандарт 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).

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

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

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

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

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

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

В компиляторе 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 !=

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top