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 ||
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?
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.
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]
:
- dla niektórych operatorów i znaków interpunkcyjnych przewidziane są alternatywne oznaczenia symboli.
- 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: -)
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++.
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).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.
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.
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ć.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
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