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
.
fuente
Respuestas:
¿Es el pastel una mentira?
Como ha habido mucho debate sobre si el pastel es o no una mentira, escribí este programa para responder a esta pregunta polémica.
¿Cuál será el resultado?
DO:
C ++:
fuente
Solo algunos bools
http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH
fuente
Podría haber hecho esto con un programa de 3 líneas, pero sería obvio por qué produce resultados diferentes para C y C ++. Entonces, en lugar de eso, comencé a escribir un programa más grande con algo de estrategia que obtiene resultados diferentes en C y C ++ ...
Necesita especificar una línea de comando. Cuando lo ejecuto en mi copia de gcc obtengo este resultado:
¿Cómo pueden salir las cosas tan horriblemente mal?
fuente
fuente
Éste funciona con C ++ 11 y versiones posteriores y cualquier C hasta ahora (antes de C11).
Ver aquí: C ++: http://ideone.com/9Gkg75 y C: http://ideone.com/eECSmr
Explota el hecho de que en C ++ 11 la palabra clave auto tiene un nuevo significado. Entonces, mientras que en C es de tipo int almacenado en una ubicación AUTOmatic, es de tipo char en C ++ 11.
EDITAR: Como FUZxxl dijo que el int implícito se eliminó en C11.
fuente
int
regla implícita .Programa de autodescripción
Esto imprimirá "¡Este programa está escrito en C!" si se compila usando un compilador de C; de lo contrario, imprimirá "¡Este programa está escrito en C ++!". Necesita un compilador C99.
fuente