El concepto de este desafío es bastante simple. ¡Todo lo que tiene que hacer es escribir un programa que compilará como C válido y C ++ válido! Bueno, hay algunas capturas. El programa debe comportarse de manera diferente cuando se compila en cada idioma. El programa debe tener una salida diferente para cada idioma para ser considerado "comportándose de manera diferente".
Reglas
- El programa debe ser válido tanto en C como en C ++
- El programa debe tener diferentes resultados según el idioma en que se compiló.
#ifdef __cplusplus
¡u otros trucos de preprocesador "fáciles" se desaconsejan! (Sin embargo, otras operaciones de preprocesador están perfectamente bien).- Trate de no hacer que parezca completamente obvio que el programa hace algo diferente.
Este es un concurso de popularidad , por lo que gana quien tenga la solución más interesante y sorprendente. ¡Que te diviertas!
Ejemplo:
Creé mi propio programa para ver si esto era posible sin #ifdef
trucos:
#include <stdio.h>
#include <string.h>
char *m="C++ rules!";
int t[11]={0,0,0,0,1,-1,-3,9,-8,82,0};
char tr(char c,int i)
{
return c+((sizeof('!')+1)&1)*t[i];
}
int main()
{
int i = 0;
for(;i<strlen(m);i++)
{
printf("%c",tr(m[i],i));
}
printf("\n");
return 0;
}
Este programa se genera C++ rules!
cuando se compila en C ++ y C++ stinks
cuando se compila en C.
Explicación:
Lo que causa la diferencia entre idiomas es la
tr()
función. Aprovecha una de las diferencias entre C y C ++, específicamente, cómo se tratan los literales char. En C, se tratan como enteros, por lo quesizeof('!')
devuelve 4, a diferencia de 1 en C ++. La((...+1)&1)
parte es solo parte de una operación simple a nivel de bits que devolverá 1 sisizeof('!')
devuelve 4 y 0 si devuelve 1. Ese número resultante se multiplica por las entradas en la matrizt
y luego ese producto finalmente se agrega al carácter específico que se está transformando. En C ++, el producto siempre será cero, por lo que la cadenaC++ rules!
permanece sin cambios. En C, el producto siempre será el valor ent
, por lo que la cadena cambia aC++ stinks
.