Me encontré con el siguiente programa, que se compila sin errores ni advertencias:
int main(){
<:]{%>; // smile!
}
¿Qué hace el programa y qué es esa expresión sonriente?
Me encontré con el siguiente programa, que se compila sin errores ni advertencias:
int main(){
<:]{%>; // smile!
}
¿Qué hace el programa y qué es esa expresión sonriente?
Respuestas:
Esa es una lambda vacía con un disfraz de dígrafo. Las lambdas normales no tienen barba.
El programa usa dígrafos para representar lo siguiente:
[] {};
Esta es una expresión lambda que no hace nada. Los símbolos correspondientes tienen estos equivalentes:
<: = [
%> = }
Aunque generalmente no son necesarios hoy en día, los dígrafos son útiles para cuando su teclado carece de ciertas teclas necesarias para usar el conjunto de caracteres de origen básico de C ++, es decir, las gráficas. La combinación de los caracteres que forman un dígrafo se procesan como una sola ficha. Esto a su vez compensa los teclados u otro hardware o software insuficientemente equipados.
El programa está utilizando dígrafos , que permiten la programación en C ++ con teclados (o codificaciones de texto) que pueden no tener los caracteres que C ++ usa típicamente.
El código resuelve esto:
int main(){
[]{}; // smile!
}
int main(){ <:]{%>; // smile! }
Básicamente es una expresión Lambda (la expresión Lambda es una de las características de C ++ 11 ) que usa dígrafos (tanto los dígrafos como los trigrafos funcionan en C ++):
[] {};
Usando solo dígrafos:
<:]<%};
<:]<%%>;
[:>{%>; // like my cubic hat?
[:><%};
[:><%%>;
Mezclándolos con Trigraphs:
<:??)<%??>; // popeye
??(:>{??>; // pirate