Pergunta

Acabei de ler este bom pedaço do Reddit.

Eles mencionam and e or sendo "Tokens Alternativas" para && e ||

Eu estava realmente desconhecem estes até agora. Claro, todo mundo sabe sobre a di-gráficos e tri-gráficos , mas and e or? Desde quando? Será esta uma recente adição ao padrão?

Eu apenas verifiquei com o Visual C ++ 2008 e não parecem reconhecer estes como outra coisa que não um erro de sintaxe. O que está acontecendo?

Foi útil?

Solução

MSVC apoia-los como palavras-chave apenas se você usar a opção /Za para extensões com deficiência; isto é verdade a partir de, pelo menos, VC7.1 (VS2003).

Você pode obtê-los suportado como macros por incluindo iso646.h.

O meu palpite é que eles acreditam que o que os torna palavras-chave por padrão iria quebrar muito código existente (e eu não ficaria surpreso se eles têm razão).

Isso foi discutido em uma pergunta há algumas semanas em algum lugar aqui no SO, mas eu não consigo busca do SO ou o Google para encontrar a maldita coisa.

Outras dicas

A partir do C 11 ++ padrão, 2.6/ Alternative tokens:

  1. representações simbólicas alternativos são fornecidos para alguns operadores e pontuadores.
  2. Em todos os aspectos da língua, cada alternativa comporta simbólicos da mesma, respectivamente, como seu token primário, exceto para a sua ortografia. O conjunto de sinais alternativos é definido na Tabela 2.

Tabela 2 - símbolos alternativos

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

Para realmente responder à pergunta:

Eles foram definidos no primeiro padrão C ++.

Veja o padrão C ++. A comissão de projecto # 2 está disponível gratuitamente em ftp: //ftp.research.att .com / dist / c ++ std / WP / CD2 / body.pdf , embora seja não-autorizada, out-of-date, e parcialmente incorreta em alguns lugares. Especificamente, na secção 2.5, Fichas alternativos , o seguinte são definidos:

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

Embora, honestamente, eu nunca vi qualquer um deles já usou exceto para and, or e not e, mesmo assim, esses são raros. Note-se que estes não são permitidas por padrão em código C simples, apenas em C ++. Se você quiser usá-los em C, você tem que quer #define-los a si mesmo como macros, ou #include o <iso646.h> cabeçalho, que define todas as opções acima, exceto para <% >% <: :> %: %:%: como macros (ver secção 7.9 do C99 standard).

Você pode se surpreender ao aprender sobre o resto deles:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

Lista de C ++ Palavras-chave .

Eu acredito que as versões recentes do GCC apoiar essas palavras-chave.

Embora a questão é velho, eu gostaria de fornecê-lo com a resposta mais ou menos completo: fichas alternativos foram já uma parte do momento retirada C ++ 98 ( ISO / IEC 14882: 1998 , a qual, creio eu, foi a primeira norma ISO para C ++). Embora não seja uma prova em si (e eu não possuo uma cópia do ISO para c ++ 98), aqui está um link -. ver secção C ++

Como mencionado em outras respostas, compilador MSVC está violando [lex.digraph] do padrão quando / Za sinalizador não for especificado.

O GNU compilador g ++ tem-los, mas eu não sei sobre MS VC ++.

Você pode obter a mesma funcionalidade, colocando isso no topo do seu arquivo de código.

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

Embora isso é meio hackish, ele deve funcionar.

Eles estão no documento de trabalho para o novo C ++ padrão, na página 14: C ++ Padrão

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top