Il concetto di questa sfida è piuttosto semplice. Tutto quello che devi fare è scrivere un programma che verrà compilato sia come C valido che come C ++ valido! Bene, ci sono alcune catture. Il programma deve comportarsi diversamente quando compilato in ciascuna lingua. Il programma deve avere un output diverso per ogni lingua per essere considerato "comportarsi diversamente".
Regole
- Il programma deve essere valido sia in C che in C ++
- Il programma deve avere output diversi in base alla lingua in cui è stato compilato.
#ifdef __cplusplus
o altri trucchi "facili" per il preprocessore sono scoraggiati! (Tuttavia, altre operazioni del preprocessore vanno benissimo.)- Cerca di non far sembrare del tutto evidente che il programma fa qualcosa di diverso.
Questo è un concorso di popolarità , quindi vince chi ha la soluzione più interessante e sorprendente. Divertiti!
Esempio:
Ho creato il mio programma per vedere se ciò fosse possibile anche senza #ifdef
trucchi:
#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;
}
Questo programma genera C++ rules!
quando compilato in C ++ e C++ stinks
quando compilato in C.
Spiegazione:
Ciò che causa la differenza tra le lingue è la
tr()
funzione. Sfrutta una delle differenze tra C e C ++, in particolare il modo in cui vengono trattati i letterali char. In C, vengono trattati come numeri interi, quindisizeof('!')
restituisce 4, anziché 1 in C ++. La((...+1)&1)
parte è solo parte di una semplice operazione bit a bit che restituirà 1 sesizeof('!')
restituisce 4 e 0 se restituisce 1. Quel numero risultante viene moltiplicato per gli ints nella matricet
e quindi quel prodotto viene infine aggiunto al carattere specifico che viene trasformato. In C ++ il prodotto sarà sempre zero, quindi la stringaC++ rules!
rimane invariata. In C, il prodotto sarà sempre il valore int
e quindi la stringa cambia inC++ stinks
.