Koncepcja tego wyzwania jest dość prosta. Wszystko, co musisz zrobić, to napisać program, który skompiluje się zarówno jako poprawny C, jak i poprawny C ++! Cóż, są pewne połowy. Program musi zachowywać się inaczej po skompilowaniu w każdym języku. Program musi mieć różne dane wyjściowe dla każdego języka, aby można go było uznać za „zachowujący się inaczej”.
Zasady
- Program musi mieć poprawne C i C ++
- Program musi mieć różne wyniki w zależności od języka, w którym został skompilowany.
#ifdef __cplusplus
lub inne „łatwe” sztuczki preprocesora są odradzane! (Inne operacje preprocesora są jednak całkowicie w porządku).- Staraj się, aby nie wydawało się to całkowicie oczywiste, że program robi coś innego.
To konkurs popularności , więc wygrywa ten, kto ma najbardziej interesujące i zaskakujące rozwiązanie. Baw się dobrze!
Przykład:
Stworzyłem własny program, aby sprawdzić, czy można to zrobić bez #ifdef
sztuczek:
#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;
}
Ten program generuje dane C++ rules!
po skompilowaniu w C ++ i C++ stinks
po kompilacji w C.
Wyjaśnienie:
To, co powoduje różnicę między językami, to
tr()
funkcja. Wykorzystuje jedną z różnic między C i C ++, a konkretnie sposób traktowania literałów char. W C są one traktowane jako liczby całkowite, więcsizeof('!')
zwraca 4, w przeciwieństwie do 1 w C ++.((...+1)&1)
Część jest tylko część prostą operację logiczną, która zwraca 1 jeżelisizeof('!')
wraca 4, oraz 0, gdy powraca 1. Tak otrzymaną ilość jest mnożona przez wskazówki w tablicyt
, a następnie produkt ten koniec dodaje się do konkretnych postaci są transformowane. W C ++ produkt zawsze będzie wynosił zero, więc ciąg znakówC++ rules!
pozostaje niezmieniony. W C iloczyn zawsze będzie wartością wt
, więc łańcuch zmienia się naC++ stinks
.
źródło
Odpowiedzi:
Czy to kłamstwo?
Ponieważ trwało wiele dyskusji na temat tego, czy ciasto jest kłamstwem, napisałem ten program, aby odpowiedzieć na to sporne pytanie.
Jaki będzie wynik?
DO:
C ++:
źródło
Tylko trochę booli
http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH
źródło
Mógłbym to zrobić za pomocą 3-liniowego programu, ale wtedy byłoby oczywiste, dlaczego produkuje różne wyniki dla C i C ++. Zamiast tego zacząłem pisać większy program z pewną stegonografią, który uzyskuje różne wyniki w C i C ++ ...
Musisz podać wiersz polecenia. Kiedy uruchomię go na mojej kopii gcc, otrzymuję ten wynik:
Jak sprawy mogą potoczyć się tak okropnie źle?
źródło
źródło
Ten działa z C ++ 11 i nowszymi oraz dowolnym C do tej pory (przed C11).
Zobacz tutaj: C ++: http://ideone.com/9Gkg75 i C: http://ideone.com/eECSmr
Wykorzystuje fakt, że w C ++ 11 słowo kluczowe auto zyskało nowe znaczenie. Tak więc, podczas gdy in C jest typu int przechowywane w lokalizacji AUTOmatic, jest typu char w C ++ 11.
EDYCJA: Jak powiedział FUZxxl, domyślna int została usunięta w C11.
źródło
int
regułę.Program samoopisujący
Spowoduje to wydrukowanie „Ten program jest napisany w C!” jeśli skompilowany przy użyciu kompilatora C; w przeciwnym razie wypisze „Ten program jest napisany w C ++!”. Potrzebuje kompilatora C99.
źródło