Das Konzept dieser Herausforderung ist ziemlich einfach. Sie müssen lediglich ein Programm schreiben, das sowohl als gültiges C als auch als gültiges C ++ kompiliert wird! Nun, es gibt einige Fänge. Das Programm muss sich beim Kompilieren in jeder Sprache anders verhalten. Das Programm muss für jede Sprache eine andere Ausgabe haben, um als "anders verhalten" zu gelten.
Regeln
- Das Programm muss sowohl in C als auch in C ++ gültig sein
- Das Programm muss abhängig von der Sprache, in der es kompiliert wurde, unterschiedliche Ausgaben haben.
#ifdef __cplusplus
oder andere "einfache" Präprozessor-Tricks sind nicht zu empfehlen! (Andere Präprozessoroperationen sind jedoch völlig in Ordnung.)- Versuchen Sie nicht ganz offensichtlich zu machen, dass das Programm etwas anderes macht.
Dies ist ein Beliebtheitswettbewerb , bei dem jeder gewinnt, der die interessanteste und überraschendste Lösung hat. Habe Spaß!
Beispiel:
Ich habe mein eigenes Programm erstellt, um zu sehen, ob dies überhaupt mit unseren #ifdef
Tricks möglich ist:
#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;
}
Dieses Programm wird C++ rules!
beim Kompilieren in C ++ und C++ stinks
beim Kompilieren in C ausgegeben.
Erläuterung:
Was den Unterschied zwischen den Sprachen verursacht, ist die
tr()
Funktion. Dabei wird einer der Unterschiede zwischen C und C ++ ausgenutzt, insbesondere, wie Zeichenliterale behandelt werden. In C werden sie als Ganzzahlen behandelt, daher wirdsizeof('!')
4 im Gegensatz zu 1 in C ++ zurückgegeben. Der((...+1)&1)
Teil ist nur ein Teil einer einfachen bitweisen Operation, die 1sizeof('!')
zurückgibt, wenn 4 zurückgegeben wird, und 0, wenn 1 zurückgegeben wird. Diese resultierende Zahl wird mit den ints in array multipliziert,t
und dieses Produkt wird schließlich zu dem spezifischen Zeichen hinzugefügt, das transformiert wird. In C ++ ist das Produkt immer Null, sodass die ZeichenfolgeC++ rules!
unverändert bleibt. In C ist das Produkt immer der Wert int
, und daher ändert sich die Zeichenfolge inC++ stinks
.