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
.
Réponses:
Le gâteau est-il un mensonge?
Comme il y a eu beaucoup de débats pour savoir si le gâteau est ou non un mensonge, j'ai écrit ce programme pour répondre à cette question controversée.
Quel sera le résultat?
C:
C ++:
la source
Juste quelques bools
http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH
la source
J'aurais pu le faire avec un programme en 3 lignes mais alors il serait évident pourquoi il produit des résultats différents pour C et C ++. Au lieu de cela, j'ai commencé à écrire un plus gros programme avec une stégonographie qui obtient des résultats différents en C et C ++ ...
Vous devez spécifier une ligne de commande. Lorsque je l'exécute sur ma copie de gcc, j'obtiens cette sortie:
Comment les choses peuvent-elles aller si horriblement mal?
la source
la source
Celui-ci fonctionne avec C ++ 11 et plus récent et tout C jusqu'à présent (avant C11).
Voir ici: C ++: http://ideone.com/9Gkg75 et C: http://ideone.com/eECSmr
Il exploite le fait qu'en C ++ 11, le mot clé auto a pris un nouveau sens. Ainsi, si un in C est de type int stocké dans un emplacement AUTOmatic, il est de type char en C ++ 11.
EDIT: Comme FUZxxl l'a dit, l'intim implicite a été supprimé dans C11.
la source
int
règle implicite .Programme auto-descriptif
Cela imprimera "Ce programme est écrit en C!" si compilé à l'aide d'un compilateur C; sinon, il affichera "Ce programme est écrit en C ++!". Il a besoin d'un compilateur C99.
la source