Le concept de ce défi est assez simple. Tout ce que vous avez à faire est d'écrire un programme qui se compilera en C valide et en C ++ valide! Eh bien, il y a des captures. Le programme doit se comporter différemment lorsqu'il est compilé dans chaque langue. Le programme doit avoir une sortie différente pour chaque langue afin d'être considéré comme "se comportant différemment".
Règles
- Le programme doit être à la fois C et C ++ valide
- Le programme doit avoir des sorties différentes en fonction de la langue dans laquelle il a été compilé.
#ifdef __cplusplus
ou d'autres astuces de préprocesseur "faciles" sont déconseillées! (Cependant, d'autres opérations de préprocesseur sont parfaitement correctes.)- Essayez de ne pas rendre complètement évident que le programme fait quelque chose de différent.
C'est un concours de popularité , donc celui qui a la solution la plus intéressante et surprenante gagne. S'amuser!
Exemple:
J'ai créé mon propre programme pour voir si c'était même possible de le faire sans #ifdef
trucs:
#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;
}
Ce programme sort C++ rules!
lorsqu'il est compilé en C ++ et C++ stinks
lorsqu'il est compilé en C.
Explication:
Ce qui cause la différence entre les langues, c'est la
tr()
fonction. Il tire parti de l'une des différences entre C et C ++, en particulier, la façon dont les littéraux char sont traités. En C, ils sont traités comme des entiers, doncsizeof('!')
renvoie 4, par opposition à 1 en C ++. La((...+1)&1)
partie n'est qu'une partie d'une opération au niveau du bit simple qui renverra 1 sisizeof('!')
renvoie 4 et 0 si elle renvoie 1. Ce nombre résultant est multiplié par les entrées dans le tableaut
, puis ce produit est finalement ajouté au caractère spécifique en cours de transformation. En C ++, le produit sera toujours nul, donc la chaîneC++ rules!
reste inchangée. En C, le produit sera toujours la valeur ent
, et donc la chaîne passe àC++ stinks
.