Quando os tokens ‘and’ e ‘ou’ foram introduzidos em C ++?

Acabei de ler este belo pedaço do Reddit.

Eles mencionam and / or sendo “Tokens Alternativos” para && e ||

Eu realmente não sabia disso até agora. Claro, todo mundo sabe sobre os diógrafos e tri-charts , mas and e or ? Desde quando? Esta é uma adição recente ao padrão?

Acabei de verificá-lo com o Visual C ++ 2008 e ele não parece reconhecê-los como algo diferente de um erro de syntax. O que está acontecendo?

    O MSVC os suporta como palavras-chave somente se você usar a opção /Za para desabilitar extensões; isso é verdade pelo menos em VC7.1 (VS2003).

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

    Meu palpite é que eles acreditam que torná-los palavras-chave por padrão quebraria muito o código existente (e eu não ficaria surpreso se eles estivessem certos).

    Isso foi discutido em uma questão de algumas semanas atrás, em algum lugar aqui no SO, mas eu não consigo fazer a pesquisa do SO ou o Google para encontrar a maldita coisa.

    Do padrão C ++ 11, 2.6/ Alternative tokens :

    1. Representações simbólicas alternativas são fornecidas para alguns operadores e pontuadores.
    2. Em todos os aspectos da linguagem, cada token alternativo se comporta da mesma forma, respectivamente, como seu token primário, exceto por sua ortografia. O conjunto de tokens alternativos é definido na Tabela 2.

    Tabela 2 – tokens 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 a pergunta:

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

    Veja o padrão C ++. O esboço 2 do comitê está disponível gratuitamente em ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf , embora seja não-autoritativo, desatualizado e parcialmente incorreto em alguns lugares. Especificamente, na seção 2.5, Tokens Alternativos , os seguintes são definidos:

     Primária Alternativa
     <% {
     %>}
     <: [
     :]
     %: #
     %:%: ##
     e &&
     bitor |
     ou ||
     xor ^
     compl ~
     bitand &
     and_eq & =
     or_eq | =
     xor_eq ^ =
     não !
     not_eq! =
    

    Embora, honestamente, eu nunca tenha visto nenhum deles usado exceto, and , or , e not , e mesmo assim, esses são raros. Note que estes NÃO são permitidos por padrão no código C simples, apenas em C ++. Se você quiser usá-las em C, você terá que #define definir elas mesmas como macros, ou o header , que define todas as acima, exceto para <% >% <: :> %: %:%: como macros (consulte a seção 7.9 do padrão C99).

    G + + tem eles, mas eu não sei sobre o 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 seja meio que hackea, deveria funcionar.

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

     and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq 

    Lista de palavras-chave C ++ .

    Acredito que versões recentes do GCC suportam essas palavras-chave.

    Embora a questão seja antiga, eu gostaria de fornecer uma resposta mais ou menos completa: os tokens alternativos já faziam parte do C ++ 98 ( ISO / IEC 14882: 1998) que, acredito, foi o primeiro. Padrão ISO para C ++). Embora não seja uma prova em si (e eu não possuo uma cópia da ISO para c + + 98), aqui está um link – veja a seção C ++.

    Como mencionado nas outras respostas, o compilador MSVC está violando a seção [lex.digraph] do padrão quando o sinalizador / Za não é especificado.

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