इस चुनौती की अवधारणा बहुत सरल है। आपको बस एक प्रोग्राम लिखना है जो कि मान्य C और वैध C ++ दोनों के रूप में संकलित होगा! खैर, कुछ कैच हैं। प्रत्येक भाषा में संकलित होने पर कार्यक्रम को अलग तरह से व्यवहार करना चाहिए। कार्यक्रम को "अलग तरह से व्यवहार" करने के लिए प्रत्येक भाषा के लिए अलग-अलग आउटपुट होना चाहिए।
नियम
- कार्यक्रम वैध सी और सी ++ दोनों होना चाहिए
- कार्यक्रम में जिस भाषा में इसे संकलित किया गया था, उसके आधार पर अलग-अलग आउटपुट होना चाहिए।
#ifdef __cplusplusया अन्य "आसान" प्रीप्रोसेसर चाल को हतोत्साहित किया जाता है! (अन्य प्रीप्रोसेसर ऑपरेशन पूरी तरह से ठीक हैं, हालांकि।)- यह पूरी तरह से स्पष्ट नहीं करने की कोशिश करें कि कार्यक्रम कुछ अलग करता है।
यह एक लोकप्रियता-प्रतियोगिता है , इसलिए जिसने भी सबसे दिलचस्प और आश्चर्यजनक समाधान जीता है। मज़े करो!
उदाहरण:
मैं अपने खुद के कार्यक्रम बनाया देखने के लिए अगर यह बाहर से कोई लेना देना भी संभव हो गया था #ifdefचाल:
#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;
}
यह प्रोग्राम आउटपुट करता है C++ rules!जब C ++ में संकलित किया जाता है और C++ stinksजब C में संकलित किया जाता है।
स्पष्टीकरण:
भाषाओं के बीच अंतर का कारण क्या है
tr()। यह सी और सी ++ के बीच के अंतरों में से एक का लाभ उठाता है, विशेष रूप से, कैसे चार शाब्दिक व्यवहार किया जाता है। C में, उन्हें पूर्णांक के रूप में माना जाता है, इसलिएsizeof('!')4, C ++ में 1 के विपरीत रिटर्न देता है। यह((...+1)&1)हिस्सा एक साधारण बिटवाइज़ ऑपरेशन का एक हिस्सा है, जोsizeof('!')4 रिटर्न करने पर 1 वापस आ जाएगा , और 0 अगर यह रिटर्न करता है तो 1. परिणामी संख्या को सरणी में चींटियों द्वारा गुणा किया जाता हैtऔर फिर उस उत्पाद को अंत में रूपांतरित होने वाले विशिष्ट वर्ण में जोड़ा जाता है। C ++ में उत्पाद हमेशा शून्य रहेगा, इसलिए स्ट्रिंगC++ rules!अपरिवर्तित रहता है। सी में, उत्पाद हमेशा में मूल्य होगाtऔर इसलिए स्ट्रिंग में परिवर्तन होता हैC++ stinks।