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
.
fonte
Respostas:
O bolo é uma mentira?
Como houve muito debate sobre se o bolo é ou não uma mentira, escrevi este programa para responder a essa questão controversa.
Qual será o resultado?
C:
C ++:
fonte
Apenas alguns bolinhos
http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH
fonte
Eu poderia ter feito isso com um programa de 3 linhas, mas seria óbvio por que ele produz resultados diferentes para C e C ++. Então, em vez disso, comecei a escrever um programa maior com alguma estegonografia, que obtém resultados diferentes em C e C ++ ...
Você precisa especificar uma linha de comando. Quando o executo na minha cópia do gcc, recebo esta saída:
Como as coisas podem dar tão terrivelmente errado?
fonte
fonte
Este funciona com C ++ 11 e mais recente e com qualquer C até o momento (antes de C11).
Veja aqui: C ++: http://ideone.com/9Gkg75 e C: http://ideone.com/eECSmr
Explora o fato de que no C ++ 11 a palavra-chave auto ganhou um novo significado. Portanto, enquanto a em C é do tipo int armazenado em um local AUTOmatic, é do tipo char no C ++ 11.
EDIT: Como FUZxxl disse que o int implícito foi removido em C11.
fonte
int
regra implícita .Programa autoexplicativo
Isso exibirá "Este programa está escrito em C!" se compilado usando um compilador C; caso contrário, será impresso "Este programa está escrito em C ++!". Ele precisa de um compilador C99.
fonte