Когда были введенные в С++ "и" и "или" альтернативные токены?
Я только что прочитал эту приятную штуку от 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:
Стандарт С++