O conceito deste desafio é bastante simples. Tudo que você precisa fazer é escrever um programa que será compilado como C válido e C ++ válido! Bem, existem algumas capturas. O programa deve se comportar de maneira diferente quando compilado em cada idioma. O programa deve ter saída diferente para cada idioma para ser considerado "se comportando de maneira diferente".
Regras
- O programa deve ser válido em C e C ++
- O programa deve ter saídas diferentes com base no idioma em que foi compilado.
#ifdef __cplusplus
ou outros truques "fáceis" do pré-processador são desencorajados! (Outras operações do pré-processador são perfeitamente boas, no entanto.)- Tente não parecer completamente óbvio que o programa faz algo diferente.
Este é um concurso de popularidade , para quem vencer a solução mais interessante e surpreendente. Diverta-se!
Exemplo:
Eu criei meu próprio programa para ver se isso era possível com #ifdef
truques:
#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 gera C++ rules!
quando compilado em C ++ e C++ stinks
quando compilado em C.
Explicação:
O que causa a diferença entre os idiomas é a
tr()
função. Ele tira proveito de uma das diferenças entre C e C ++, especificamente, como os literais de caracteres são tratados. Em C, eles são tratados como números inteiros; portanto,sizeof('!')
retorna 4, em oposição a 1 em C ++. A((...+1)&1)
parte é apenas parte de uma operação bit a bit simples que retornará 1 sesizeof('!')
retornar 4 e 0 se retornar 1. Esse número resultante é multiplicado pelas entradas na matrizt
e, em seguida, esse produto é finalmente adicionado ao caractere específico que está sendo transformado. Em C ++, o produto sempre será zero, portanto, a cadeiaC++ rules!
permanece inalterada. Em C, o produto sempre será o valor emt
e, portanto, a sequência será alterada paraC++ stinks
.