C / C ++ Polyglot लिखें


27

इस चुनौती की अवधारणा बहुत सरल है। आपको बस एक प्रोग्राम लिखना है जो कि मान्य 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


5
मुझे यकीन है कि यह कुछ का एक ठिकाना है ...
बीटा डेके

@BetaDecay है? मैंने कुछ इसी तरह की खोज करने की कोशिश की और मुझे कुछ नहीं मिला।
मेवि

क्या आप यह बता सकते हैं कि आपका कार्यक्रम अलग तरह से कैसे काम करता है (यदि यह चुनौती को खराब नहीं करता है)?
AL

@ मैंने अपनी पोस्ट के स्पष्टीकरण में संपादित किया।
मेवि

सभी लोगों stackoverflow.com/questions/2038200/... यहां इस्तेमाल किया जा सकता है - एक छोटे से कहानियो के साथ।
जेरी यिर्मयाह 3

जवाबों:


18

क्या केक झूठ है?

जैसा कि इस बात पर बहुत बहस हुई है कि केक झूठ है या नहीं, मैंने इस विवादास्पद प्रश्न का उत्तर देने के लिए यह कार्यक्रम लिखा था।

#include <stdio.h>

// checks if two things are equal
#define EQUALS(a,b) (sizeof(a)==sizeof(b)) 

struct Cake{int Pie;}; // the cake is a pie!
typedef struct Cake Lie;
main(){
    struct CakeBox{
        struct Cake{ // the cake contains lies!
            Lie Lies[2];
        };
    };
    typedef struct Cake Cake;

    printf("The cake is ");
    if(EQUALS(Cake, Lie)){
        printf("a LIE!\n");
    }else{
        printf("..not a lie?\n");
    }
    return 0;
}

परिणाम क्या होगा?

सी:

The cake is ..not a lie?

सी ++:

The cake is a LIE!


1
यह। यह मुझे पंसद है।
फ़ूजएक्सएक्सएक्स

9

सिर्फ कुछ बूल

#include <stdio.h>

int test(bool)
  {
  return sizeof(bool) == sizeof(int);
  }

int main(void)
  {
  puts(test(0) ? "C" : "C++");
  return 0;
  }

http://codepad.org/dPFou20W
http://codepad.org/Ko6K2JBH


बूल
malat

8
@ मलतब यप, और वास्तव में इस तथ्य का इस समाधान में उपयोग किया जाता है। सी ++ के लिए फ़ंक्शन इंट टेस्ट (बूल / * अनाम बूलियन तर्क * /) है; और C के लिए यह डिफॉल्ट int डिक्लेरेशन wich का उपयोग करता है जिसका अर्थ है int test (int bool); इसलिए 'बूल' पूर्णांक चर का एक नाम है।
क्वर्टी

5

मैं एक 3 लाइन कार्यक्रम के साथ ऐसा कर सकता था लेकिन फिर यह स्पष्ट होगा कि यह C और C ++ के लिए अलग-अलग परिणाम क्यों देता है। इसलिए इसके बजाय मैंने कुछ स्टेग्नोग्राफ़ी के साथ एक बड़ा कार्यक्रम लिखना शुरू किया जिसमें C और C ++ में अलग-अलग परिणाम मिलते हैं ...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct product
{
    int quantity;
    char name[20];
    char desc[80];
}; 

struct _customer
{
    char name[80];
    struct product *products;
} customer;

int main(int argc, char *argv[])
{

struct shipment
{
    char tracking_number[40];
    int quantity;
    struct product { int model; int serial; } sku;
};

struct _supplier
{
    char name[80];
    struct shipment *shipments;
} supplier;

/* now read the command line and allocate all the space we need */

if(argc<5)
{
    printf("Usage: %s <supplier name> <# of shipments> <customer name> <# of products> ",argv[0]);
    exit(1);
}

strcpy(supplier.name,argv[1]);
int shipments_size = atoi(argv[2])*sizeof(struct shipment);
printf("Allocating %d bytes for %s shipments\n", shipments_size,supplier.name);
supplier.shipments=(struct shipment *)malloc(shipments_size);

strcpy(customer.name,argv[3]);
int products_size = atoi(argv[4])*sizeof(struct product);
printf("Allocating %d bytes for %s products\n", products_size,customer.name);

/* ... TODO ... finish the rest of this program later */

free(customer.products);
free(supplier.shipments);

return 0;
}

आपको एक कमांड लाइन निर्दिष्ट करने की आवश्यकता है। जब मैं इसे अपनी प्रतिलिपि gcc पर चलाता हूं तो मुझे यह आउटपुट मिलता है:

>g++ x.cpp

>a.exe "Bob Supplier" 1 "Jane Customer" 1
Allocating 52 bytes for Bob Supplier shipments
Allocating 104 bytes for Jane Customer products

>gcc x.c

>a.exe "Bob Supplier" 1 "Jane Customer" 1
Allocating 52 bytes for Bob Supplier shipments
Allocating 8 bytes for Jane Customer products

कैसे चीजें इतनी बुरी तरह से गलत हो सकती हैं?


हालाँकि अन्य लोगों ने भी ऐसा ही किया, लेकिन आपने इसे बहुत अच्छा किया।
kirbyfan64sos


4

यह C ++ 11 और नए और किसी भी C के साथ अब तक (C11 से पहले) काम करता है।

#include <stdio.h>

int main()
{
    auto a = 'a';
    printf(sizeof(a) == sizeof(int) ? "C\n" : "C++\n");
    return 0;
}

यहाँ देखें: C ++: http://ideone.com/9Gkg75 और C: http://ideone.com/eECSmr

यह इस तथ्य का फायदा उठाता है कि C ++ 11 में ऑटो कीवर्ड को एक नया अर्थ मिला। तो जबकि C में एक प्रकार का int एक AUTOmatic लोकेशन में संग्रहित है, यह C ++ 11 में टाइप चार का है।

EDIT: जैसा कि FUZxxl ने कहा कि अंतर्निहित int C11 में हटा दिया गया था।


1
C11 के साथ काम नहीं करता है क्योंकि C11 ने निहित intनियम को हटा दिया है ।
FUZxxl

@FUZxxl धन्यवाद, मैंने अपनी पोस्ट समायोजित की।
फेलिक्स बाइटो

1

आत्म वर्णन कार्यक्रम

यह "यह कार्यक्रम सी में लिखा है!" यदि सी संकलक का उपयोग करके संकलित किया जाता है; अन्यथा, यह "C ++ में लिखा गया है!" इसे C99 कंपाइलर की जरूरत है।

#include <stdbool.h>
#include <stdio.h>
char str[] = "This program is written in C++ ";
#define S (sizeof(str)-sizeof(true)-sizeof(true)%4)
int main(){for(int i=S;i<=S+1;++i)str[i]=i==S?'!':'\0';puts(str);return 0;}

अधिकांश अन्य पोस्ट सी बनाम सी ++ में एक चार के आकार के अंतर का लाभ उठाते हैं; यह इस तथ्य का उपयोग करता है कि, C99 में, trueएक संख्या के रूप में परिभाषित किया गया है। यह के आकार के आधार पर विस्मयादिबोधक बिंदु और अशक्त टर्मिनेटर सम्मिलित करता है true

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.