Pregunta

acabo de leer esto buena pieza de Reddit.

ellos mencionan and y or siendo "Tokens alternativos" a && y ||

Realmente no estaba al tanto de esto hasta ahora.Por supuesto, todo el mundo sabe acerca de la dígrafos y trigráficos, pero and y or?¿Desde cuando?¿Es esta una adición reciente al estándar?

Lo acabo de comprobar con Visual C++ 2008 y no parece reconocerlos como algo más que un error de sintaxis.¿Qué está sucediendo?

¿Fue útil?

Solución

MSVC los apoya como palabras clave sólo si se utiliza la opción /Za desactivar las extensiones; esto es cierto a partir de al menos VC7.1 (VS2003).

Puede conseguirlos apoyado como macros mediante la inclusión de iso646.h.

Mi conjetura es que ellos creen que haciéndolos palabras clave por defecto sería romper demasiado código existente (y que no se sorprendería si son adecuados).

Esto se discutió en una pregunta hace un par de semanas en algún lugar aquí en la SO, pero no puede conseguir de búsqueda o Google del SO para encontrar la maldita cosa.

Otros consejos

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

  1. representaciones simbólicas alternativos se proporcionan para algunos operadores y Signos.
  2. En todos los aspectos de la lengua, cada ficha alternativa comporta de la misma, respectivamente, como su identificador primario, a excepción de su ortografía. El conjunto de tokens alternativos se define en la Tabla 2.

Tabla 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 responder a la cuestión de hecho:

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

Vea el estándar C ++. El proyecto de comité # 2 está disponible gratuitamente en ftp: //ftp.research.att .com / dist / c ++ std / WP / CD2 / body.pdf , aunque es no autorizada, fuera de fecha, y parcialmente incorrecta en unos pocos lugares. Específicamente, 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 ninguno de ellos ha utilizado alguna vez a excepción de and, or y not, e incluso entonces, esos son raros. Tenga en cuenta que estos no son admisibles por defecto en el código C llana, sólo en C ++. Si desea utilizarlos en C, que tendrá que o bien se les #define a sí mismo como macros, o #include la <iso646.h> cabecera, que define todo lo anterior a excepción de <% >% <: :> %: %:%: como macros (véase la sección 7.9 del C99 estándar).

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

C ++ Palabras clave .

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

Aunque la pregunta es antigua, me gustaría darle una respuesta más o menos completa:Los tokens alternativos ya formaban parte del C++98 actualmente retirado (ISO/CEI 14882:1998, que creo que fue el primer estándar ISO para C++).Si bien no es una prueba en sí misma (y no poseo una copia de ISO para c++98), Aquí hay un enlace: consulte la sección C++.

Como se menciona en las otras respuestas, el compilador MSVC está violando [lex.digraph] sección de la norma cuando /za La bandera no está especificada.

El compilador GNU g ++ los tiene, pero no sé acerca de MS VC ++.

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

A pesar de que esto es un poco hacker, que debería funcionar.

Se encuentran en el documento de trabajo para el nuevo estándar de C ++, en la página 14: C ++ estándar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top