একটি সি / সি ++ বহুবৃত্ত লিখুন


27

এই চ্যালেঞ্জের ধারণাটি বেশ সহজ। আপনাকে যা করতে হবে তা হ'ল একটি প্রোগ্রাম লিখুন যা বৈধ সি এবং বৈধ সি ++ উভয়ই সংকলন করবে! ঠিক আছে, কিছু ক্যাচ আছে। প্রতিটি ভাষায় সংকলিত হওয়ার সময় প্রোগ্রামটি অবশ্যই আলাদাভাবে আচরণ করবে। "আলাদাভাবে আচরণ করা" বিবেচনা করার জন্য প্রোগ্রামটির প্রতিটি ভাষার আলাদা আলাদা আউটপুট থাকতে হবে।

বিধি

  • প্রোগ্রামটি অবশ্যই বৈধ সি এবং সি ++ উভয়ই হতে পারে
  • প্রোগ্রামটি সংকলিত ভাষার উপর ভিত্তি করে প্রোগ্রামটির অবশ্যই আলাদা আউটপুট থাকতে হবে।
  • #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++ stinksসংকলিত হয় এবং যখন সি-তে সংকলিত হয় when

ব্যাখ্যা:

ভাষার মধ্যে পার্থক্যের কারণ কী তা হ'ল tr()ফাংশন। সি এবং সি ++ এর মধ্যে একটি পার্থক্যের সুবিধা গ্রহণ করে, বিশেষত, চর অক্ষরগুলি কীভাবে আচরণ করা হয়। সি-তে, তাদের পূর্ণসংখ্যা হিসাবে বিবেচনা করা হয়, সুতরাং sizeof('!')সি ++ এ 1 এর বিপরীতে 4 প্রদান করে। ((...+1)&1)অংশ একটি সহজ, bitwise অপারেশন 1 ফিরে আসবে যদি শুধু অংশ sizeof('!')আয় 4, এবং 0 যদি ফিরে আসে 1. ফলে সংখ্যা অ্যারের মধ্যে আছে ints দ্বারা গুন করা হয় যে tএবং তারপর সেই পণ্যের পরিশেষে নির্দিষ্ট অক্ষর রুপান্তরিত হচ্ছে যোগ করা হয়। সি ++ এ পণ্য সর্বদা শূন্য হবে, সুতরাং স্ট্রিং C++ rules!অপরিবর্তিত থাকবে। সি-তে, পণ্যটি সর্বদা মান হিসাবে হয় tএবং তাই স্ট্রিংটি এতে পরিবর্তিত হয় C++ stinks


5
আমি নিশ্চিত এটি কোনও কিছুর দ্বিধা ...
বিটা ডেকে

পছন্দ করুন আমি অনুরূপ কিছু অনুসন্ধান করার চেষ্টা করেছি এবং আমি কিছুই খুঁজে পেলাম না।
মেভি

আপনার প্রোগ্রামটি কীভাবে আলাদাভাবে কাজ করে তা ব্যাখ্যা করতে পারেন (যদি এটি চ্যালেঞ্জটি নষ্ট করে না)?
এএল

@AL আমি আমার পোস্টের ব্যাখ্যাতে সম্পাদনা করেছি।
মেভি

থেকে সমস্ত বেশী stackoverflow.com/questions/2038200/... এখানে ব্যবহার করা যেতে পারে - একটি সামান্য কিংকর্তব্যবিমূঢ়তা সঙ্গে।
জেরি যেরেমিয়া

উত্তর:


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
এই. আমি এই পছন্দ।
FUZxxl

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



8
@ ম্যালাত ইয়েপ, এবং ঠিক এই বাস্তবতা এই সমাধানটিতে ব্যবহৃত হয়। সি ++ এর জন্য ফাংশনটি ইন টেস্ট (বুল / * নামবিহীন বুলিয়ান আর্গুমেন্ট * /); এবং সি এর জন্য এটি ডিফল্ট ইন্ট ডিক্লেয়ারেশন ব্যবহার করে যার অর্থ ইন টেস্ট (ইন বুল); সুতরাং 'বুল' হল পূর্ণসংখ্যার ভেরিয়েবলের একটি নাম।
কিওয়ারটি

5

আমি এটি একটি 3 লাইন প্রোগ্রামের সাথে করতে পারতাম তবে এটি সি এবং সি ++ এর জন্য আলাদা ফলাফল কেন কেন তা স্পষ্ট হবে। সুতরাং পরিবর্তে আমি কিছু স্টিগনোগ্রাফি দিয়ে একটি বড় প্রোগ্রাম লিখতে শুরু করি যা সি এবং সি ++ এ বিভিন্ন ফলাফল পায় ...

#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;
}

আপনাকে একটি কমান্ড লাইন নির্দিষ্ট করতে হবে। আমি যখন এটি আমার সিসির অনুলিপিটিতে চালিত করি তখন আমি এই আউটপুটটি পাই:

>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

এটি একটি সি ++ 11 এবং আরও নতুন এবং এখন পর্যন্ত যে কোনও সি (সি 11 এর আগে) এর সাথে কাজ করে।

#include <stdio.h>

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

এখানে দেখুন: সি ++: http://ideone.com/9Gkg75 এবং সি: http://ideone.com/eECSmr

এটি সি ++ 11 এ অটো কীওয়ার্ডটির একটি নতুন অর্থ পেয়েছে এই সত্যটি কাজে লাগায়। সুতরাং যখন একটি সি এর মধ্যে টাইপ ইন্ট টাইপ করা হয় আউটোমেটিক অবস্থানে এটি সি ++ 11 তে টাইপ চর হয়।

সম্পাদনা: এফইউজেডএক্সএক্সএলএস-এর হিসাবে বলা হয়েছে যে অন্তর্নিহিত ইন্টিটি সি 11-তে সরানো হয়েছে।


1
সি 11 এর সাথে কাজ করে না কারণ সি 11 অন্তর্নিহিত intনিয়মটিকে সরিয়ে দিয়েছে ।
FUZxxl

@FUZxxl ধন্যবাদ, আমি আমার পোস্টটি সামঞ্জস্য করেছি
ফেলিক্স বাইটো

1

স্ব-বর্ণনার প্রোগ্রাম

এটি মুদ্রণ করবে "এই প্রোগ্রামটি সি তে লেখা আছে!" যদি সি সংকলক ব্যবহার করে সংকলিত হয়; অন্যথায়, এটি "এই প্রোগ্রামটি সি ++ তে লেখা আছে!" মুদ্রণ করবে। এটির জন্য একটি 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.