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
.
quelle
Antworten:
Ist der Kuchen eine Lüge?
Da viel darüber diskutiert wurde, ob der Kuchen eine Lüge ist oder nicht, habe ich dieses Programm geschrieben, um diese umstrittene Frage zu beantworten.
Was wird das Ergebnis sein?
C:
C ++:
quelle
Nur ein paar Idioten
http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH
quelle
Ich hätte das mit einem 3-zeiligen Programm machen können, aber dann wäre klar, warum es für C und C ++ unterschiedliche Ergebnisse liefert. Also habe ich stattdessen angefangen, ein größeres Programm mit Stegonographie zu schreiben, das in C und C ++ unterschiedliche Ergebnisse liefert ...
Sie müssen eine Befehlszeile angeben. Wenn ich es auf meiner Kopie von gcc laufen lasse, erhalte ich diese Ausgabe:
Wie können die Dinge so schrecklich schief gehen?
quelle
quelle
Dieser funktioniert mit C ++ 11 und neueren und allen bisherigen C-Versionen (vor C11).
Siehe hier: C ++: http://ideone.com/9Gkg75 und C: http://ideone.com/eECSmr
Es nutzt die Tatsache aus, dass das Schlüsselwort auto in C ++ 11 eine neue Bedeutung erhalten hat. Während also ein in C vom Typ int ist, der an einer AUTOmatic-Position gespeichert ist, ist es in C ++ 11 vom Typ char.
EDIT: Wie FUZxxl sagte, wurde das implizite int in C11 entfernt.
quelle
int
Regel entfernt hat.Selbstbeschreibendes Programm
Dies wird "Dieses Programm ist in C geschrieben!" wenn mit einem C-Compiler kompiliert; Andernfalls wird "Dieses Programm ist in C ++ geschrieben!" Es benötigt einen C99-Compiler.
quelle