2009-02-17 8 views
33

Acabo de leer este nice piece de Reddit.¿Cuándo se introdujeron los tokens alternativos 'y' y 'o' en C++?

Mencionan and y or ser "Fichas alternativa" a && y ||

Yo estaba muy al tanto de estos hasta ahora. Por supuesto, todo el mundo sabe sobre el di-graphs and tri-graphs, pero and y or? ¿Desde cuando? ¿Es esto una adición reciente al estándar?

Acabo de comprobarlo con Visual C++ 2008 y no parece reconocer esto como algo más que un error de sintaxis. ¿Que esta pasando?

+1

Me gusta cómo siete años después, todavía ninguna de las respuestas dadas realmente responde esta pregunta. lol –

+1

@LightnessRacesinOrbit a veces creo que no importa mucho, siempre y cuando responda las búsquedas de Google ;-) –

+0

¡He añadido una respuesta que responde la pregunta! –

Respuesta

22

MSVC los admite como palabras clave solo si usa la opción /Za para deshabilitar extensiones; esto es cierto desde al menos VC7.1 (VS2003).

Puede obtener su compatibilidad como macros incluyendo iso646.h.

Supongo que creen que convertirlas en palabras clave de forma predeterminada rompería demasiado el código existente (y no me sorprendería que estuvieran en lo cierto).

Esto fue discutido en una pregunta hace un par de semanas en algún lugar aquí en SO, pero no puedo obtener la búsqueda SO o Google para encontrar la maldita cosa.

+2

Así que Python es 50 veces genial porque puedes escribir 'y', mientras tanto, C tenía esto como característica todo el tiempo. – bobobobo

+0

@bobobobo Parece un poco frustrante que tengamos que '#include ' donde queremos utilizar estas palabras clave en Visual Studio. Probablemente no sea una sorpresa que g ++ los admita desde el primer momento, ya que están en el estándar. –

+1

Encontré este enlace que parecía relevante. Descripción del error "El compilador de Visual C++ 2012 e iso646.h no se ajusta al estándar C++ 11 con respecto al uso de tokens alternativos para operadores lógicos" estado Cerrado como diferido. https://connect.microsoft.com/VisualStudio/feedback/details/751912/alternative-tokens-for-logical-operators-c-11 – Ted

0

Es posible que se sorprenda al saber sobre el resto de ellos:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq 

Lista de C++ Keywords.

Creo que las versiones recientes de GCC admiten estas palabras clave.

+0

Apenas los llamaría nuevos. Están en el estándar original de C++, ¿verdad? –

+0

Ok, son más viejos que una década, eliminaré la palabra "nuevo". :) –

-1

que están en el documento de trabajo para el nuevo C++ estándar, en la página 14: C++ Standard

+5

Han estado en el estándar de C++ desde 1998. –

31

Desde el estándar de C++ 11, 2.6/ Alternative tokens: se proporcionan

  1. representaciones simbólicas alternativos para algunos operadores y puntuadores.
  2. En todos los aspectos del lenguaje, cada token alternativo se comporta igual, respectivamente, como token primario, excepto por su ortografía. El conjunto de tokens alternativos se define en la Tabla 2.

Tabla 2 - Alternative tokens

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

Ver el estándar C++. El borrador del comité # 2 está disponible gratuitamente en ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf, aunque no es autorizado, está desactualizado y es parcialmente incorrecto en algunos lugares. En concreto, en la sección 2.5, Fichas alternativos, se definen los siguientes:

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

Aunque honestamente, nunca he visto a alguno de ellos utilizan a excepción de and, or y not, e incluso entonces, los son raros. Tenga en cuenta que estos NO son permitidos por defecto en el código simple C, solo en C++. Si desea utilizarlos en C, que tendrá que ya sea por sí mismo #define como macros, o #include la cabecera <iso646.h>, que define todo lo anterior a excepción de <%>%<::>%:%:%: como macros (ver sección 7.9 del C99 estándar).

+2

Se permiten en C si incluye y lo han estado desde 1994. –

0

G ++ las tiene, pero no sé sobre MS VC++.

Puede obtener la misma funcionalidad al poner esto en la parte superior de su archivo 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 != 

Aunque esto es un poco hackish, debería funcionar.

+1

O incluya , si su implementación lo tiene (creo que la mayoría lo hace). –

+4

O si está usando C++. –

10

Para contestar realmente la pregunta:

se definieron en el primer estándar de C++.

0

Aunque la pregunta es antigua, me gustaría darle una respuesta más o menos completa: Los tokens alternativos ya eran parte del C++ 98 actualmente retirado (ISO/IEC 14882:1998, que, creo, fue el primero Norma ISO para C++). Aunque no es una prueba en sí mismo (y no posee una copia de ISO para C++ 98), here's a link - see C++ section.

Como se menciona en las otras respuestas, MSVC compilador está violando [lex.digraph] sección de el estándar cuando /Za no está especificado.

Cuestiones relacionadas