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
.