Kiedy w C++wprowadzono alternatywne tokeny 'and' I 'or'?

Właśnie przeczytałem tenładny kawałek z Reddita.

Wymieniają and i or jako "alternatywne tokeny" dla && i ||

Do tej pory nie zdawałem sobie z tego sprawy. Oczywiście każdy wie o di-grafach i tri-grafach , Ale and i or? Od kiedy? Czy to nowy dodatek do standardu?

Właśnie sprawdziłem to za pomocą Visual C++ 2008 i wydaje się, że nie rozpoznaje ich jako czegoś innego niż błąd składni. Co się dzieje?

Author: TylerH, 2009-02-17

8 answers

MSVC obsługuje je jako słowa kluczowe tylko wtedy, gdy używasz opcji /Za, aby wyłączyć rozszerzenia; dotyczy to co najmniej wersji VC7.1 (VS2003).

Możesz je uzyskać jako makra, włączając iso646.h.

Domyślam się, że uważają, że domyślne utworzenie ich słów kluczowych złamałoby zbyt wiele istniejącego kodu (i nie zdziwiłbym się, gdyby mieli rację).

To było omawiane w pytaniu kilka tygodni temu gdzieś tutaj na SO, ale nie mogę dostać so wyszukiwania lub Google, aby znaleźć to cholerstwo.

 24
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 04:28:25

Z pierwszy ISO C++ standard C++98, jest to opisane w 2.5/ Alternative tokens [lex.digraph]:


  1. dla niektórych operatorów i znaków interpunkcyjnych przewidziane są alternatywne oznaczenia symboli.
  2. we wszystkich aspektach języka, każdy token alternatywny zachowuje się odpowiednio tak samo, jak token główny, z wyjątkiem pisowni. Zestaw tokenów alternatywnych jest zdefiniowany w tabeli 2.

Tabela 2-tokeny alternatywne

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

So it ' s been around od najwcześniejszych dni procesu standaryzacji C++ (a) . Powodem, dla którego tak niewiele osób zdaje sobie z tego sprawę, jest prawdopodobnie to, że głównym przypadkiem użycia był przypadek osób pracujących w środowiskach, w których pełny zestaw znaków nie był koniecznie dostępny. Na przykład (i to jest rozciąganie mojej pamięci), podstawowy zestaw znaków EBCDIC na ramkach mainframe IBM nie miał znaków z nawiasami kwadratowymi [ i ].


(a) były prawdopodobnie kupione od C99, który wprowadził te digrafy (b) (Pierwsza kolumna powyżej) do języka i alternatywne pisownie (dwie pozostałe kolumny) w Nowym pliku nagłówkowym iso646.h. Ani K & R, ani C89 w ogóle o nich nie wspominają.


(b) standardowy nazywa je di-grafami pomimo faktu, że niektóre mają trzy lub cztery znaki, a nie dwa. Puryści językowi wśród nas słusznie oczekiwaliby, że będą to trygrafy i kwadrafy. Przynajmniej standardy C++ masz apologetyczny przypis o niewłaściwym użyciu, czegoś w standardzie C wciąż brakuje: -)

 33
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-29 00:38:28

Aby odpowiedzieć na pytanie:

Zostały zdefiniowane w pierwszym standardzie C++.

 12
Author: Martin Bonner supports Monica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 20:32:56

Zobacz standard C++. Projekt nr 2 Komitetu jest dostępny bezpłatnie pod adresem ftp://ftp.research.att.com/dist/c++std / WP / CD2 / body.pdf, chociaż jest nieautoryzowany, Nieaktualny i częściowo niepoprawny w kilku miejscach. W szczególności, w sekcji 2.5, alternatywne tokeny, zdefiniowane są:

Alternative Primary
<%          {
%>          }
<:          [
:>          ]
%:          #
%:%:        ##
and         &&
bitor       |
or          ||
xor         ^
compl       ~
bitand      &
and_eq      &=
or_eq       |=
xor_eq      ^=
not         !
not_eq      !=
Chociaż szczerze mówiąc, nigdy nie widziałem żadnego z nich używanego z wyjątkiem and, or, i nawet wtedy, są one rzadkie. Należy pamiętać, że są to Domyślnie niedopuszczalne w zwykłym kodzie C, tylko w C++. Jeśli chcesz użyć ich w C, musisz albo #define je samodzielnie jako makra, albo #include nagłówek <iso646.h>, który definiuje wszystkie powyższe z wyjątkiem <% >% <: :> %: %:%: jako makra (patrz punkt 7.9 standardu C99).
 5
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 05:18:07

Chociaż pytanie jest stare, chciałbym udzielić mu mniej lub bardziej pełnej odpowiedzi: Tokeny alternatywne były już częścią obecnie wycofanego C++98 (ISO / IEC 14882: 1998, który, jak sądzę, był pierwszym standardem ISO dla C++). Chociaż nie jest to dowód sam w sobie (i nie posiadam kopii ISO dla c++98), Oto link - patrz sekcja C++.

Jak wspomniano w innych odpowiedziach, kompilator MSVC narusza [lex.digraph] sekcja standardu, gdy /za flaga nie jest określona.

 1
Author: Sergey.quixoticaxis.Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 15:29:48

Możesz być zaskoczony, aby dowiedzieć się o reszcie z nich:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

Lista z słów kluczowych C++ .

Wierzę, że najnowsze wersje GCC obsługują te słowa kluczowe.

 0
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 04:29:09

Kompilator GNU g++ je ma, ale nie wiem jak MS VC++.

Możesz uzyskać tę samą funkcjonalność, umieszczając ją na górze pliku kodu.

#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 !=
Chociaż to trochę hakerskie, powinno zadziałać.
 0
Author: James Matta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-16 19:50:38

Są w dokumencie roboczym dla nowego standardu C++, na stronie 14: C++ Standard

 -1
Author: Rob Lachlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 04:15:17