programar - ¿Cuándo se introdujeron los tokens alternativos ''y'' y ''o'' en C++?
lenguaje c++ ejemplos (8)
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 ++). Si bien no es una prueba en sí misma (y no tengo una copia de ISO para c ++ 98), aquí hay un enlace: vea la sección C ++.
Como se menciona en las otras respuestas, el compilador MSVC está violando la sección [lex.digraph] del estándar cuando / Za no está especificado.
Acabo de leer esta bonita pieza de Reddit.
Mencionan and
or
son "Fichas alternativas" para &&
y ||
Realmente no estaba al tanto de esto hasta ahora. Por supuesto, todo el mundo sabe acerca de los di-graphs y tri-graphs , pero and
and? ¿Desde cuando? ¿Es esto una adición reciente al estándar?
Acabo de comprobarlo con Visual C ++ 2008 y no parece reconocer estos como algo más que un error de sintaxis. ¿Que esta pasando?
Desde el estándar C ++ 11, 2.6/ Alternative tokens
:
- Se proporcionan representaciones de tokens alternativas para algunos operadores y puntuadores.
- En todos los aspectos del lenguaje, cada token alternativo se comporta igual, respectivamente, que su token primario, a excepción de su ortografía. El conjunto de tokens alternativos se define en la Tabla 2.
Tabla 2 - Fichas alternativas
alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
<% { | and && | and_eq &=
%> } | bitor | | or_eq |=
<: [ | or || | xor_eq ^=
:> ] | xor ^ | not !
%: # | compl ~ | not_eq !=
%:%: ## | bitand & |
Están en el documento de trabajo para el nuevo estándar C ++, en la página 14: Estándar C ++
G ++ los tiene, pero no sé acerca de 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.
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 obtenerlos como macros al incluir 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 de SO o Google para encontrar la maldita cosa.
Para responder la pregunta:
Fueron definidos en el primer estándar de C ++.
Puede que se sorprenda al conocer el resto de ellos:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
Lista de palabras clave de C ++ .
Creo que las versiones recientes de GCC admiten estas palabras clave.
Ver el estándar de C ++. El borrador del comité n. ° 2 está disponible gratuitamente en , aunque no es autorizado, está desactualizado y parcialmente incorrecto en algunos lugares. Específicamente, en la sección 2.5, Fichas alternativas , se definen los siguientes:
Alternative Primary <% { %> } <: [ :> ] %: # %:%: ## and && bitor | or || xor ^ compl ~ bitand & and_eq &= or_eq |= xor_eq ^= not ! not_eq !=
Aunque, sinceramente, nunca he visto ninguno de ellos usado, excepto por and
, or
, y not
, e incluso entonces, esos son raros. Tenga en cuenta que estos no son permitidos por defecto en el código simple C, solo en C ++. Si desea usarlos en C, deberá #define
usted mismo como macros, o <iso646.h>
el encabezado <iso646.h>
, que define todo lo anterior excepto por <%
>%
<:
:>
%:
%:%:
como macros (ver sección 7.9 del estándar C99).