লোকেরা সি / সি ++ এ যে অনিয়ন্ত্রিত অনুমানগুলি করে তা প্রদর্শনের জন্য একটি শিক্ষামূলক সরঞ্জামের মধ্যে কী রয়েছে?


121

আমি এসওএর জন্য একটি সামান্য শিক্ষামূলক সরঞ্জাম প্রস্তুত করতে চাই যা প্রবর্তকদের (এবং মধ্যবর্তী) প্রোগ্রামারদের সি, সি ++ এবং তাদের প্ল্যাটফর্মগুলিতে তাদের অনিয়ন্ত্রিত অনুমানগুলি সনাক্ত এবং চ্যালেঞ্জ করতে সহায়তা করবে।

উদাহরণ:

  • "পূর্ণসংখ্যার মোড়ক"
  • "প্রত্যেকের ASCII আছে"
  • "আমি একটি শূন্যের মধ্যে একটি ফাংশন পয়েন্টার সঞ্চয় করতে পারি *"

আমি বুঝতে পেরেছিলাম যে একটি ছোট পরীক্ষা প্রোগ্রামটি বিভিন্ন প্ল্যাটফর্মে চালানো যেতে পারে, যা "প্লেজিবল" অনুমানগুলি চালায় যা এসও-র আমাদের অভিজ্ঞতা থেকে সাধারণত অনেক অনভিজ্ঞ / আধা অভিজ্ঞ অভিজ্ঞ মূলধারার বিকাশকারীদের দ্বারা তৈরি করা হয় এবং বিভিন্ন মেশিনে তারা কীভাবে ভাঙ্গা যায় তা রেকর্ড করে।

এর লক্ষ্যটি প্রমাণ করা নয় যে কোনও কাজ করা "নিরাপদ" (যা করা অসম্ভব হবে, পরীক্ষাগুলি যদি ভেঙে যায় তবে কেবল কিছু প্রমাণিত হয়), পরিবর্তে সবচেয়ে আপত্তিজনক ব্যক্তিকেও প্রদর্শন করা যে কীভাবে সবচেয়ে বেমানান অভিব্যক্তি একটি ভিন্ন মেশিনে ব্রেক করুন, যদি এটির একটি সংজ্ঞায়িত বা বাস্তবায়ন সংজ্ঞায়িত আচরণ থাকে।

এটি অর্জনের জন্য আমি আপনাকে জিজ্ঞাসা করতে চাই:

  • এই ধারণাটি কীভাবে উন্নত করা যায়?
  • কোন পরীক্ষাগুলি ভাল হবে এবং তাদের দেখতে কেমন হওয়া উচিত?
  • আপনি কী আপনার প্ল্যাটফর্মগুলিতে পরীক্ষা চালিয়ে যাবেন এবং ফলগুলি পোস্ট করতে পারেন, যাতে আমরা প্ল্যাটফর্মের একটি ডাটাবেসের সাথে শেষ করতে পারি, তারা কীভাবে আলাদা হয় এবং কেন এই পার্থক্য অনুমোদিত?

পরীক্ষার খেলনাটির বর্তমান সংস্করণ এখানে:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <stddef.h>
int count=0;
int total=0;
void expect(const char *info, const char *expr)
{
    printf("..%s\n   but '%s' is false.\n",info,expr);
    fflush(stdout);
    count++;
}
#define EXPECT(INFO,EXPR) if (total++,!(EXPR)) expect(INFO,#EXPR)

/* stack check..How can I do this better? */
ptrdiff_t check_grow(int k, int *p)
{
    if (p==0) p=&k;
    if (k==0) return &k-p;
    else return check_grow(k-1,p);
}
#define BITS_PER_INT (sizeof(int)*CHAR_BIT)

int bits_per_int=BITS_PER_INT;
int int_max=INT_MAX;
int int_min=INT_MIN;

/* for 21 - left to right */
int ltr_result=0;
unsigned ltr_fun(int k)
{
    ltr_result=ltr_result*10+k;
    return 1;
}

int main()
{
    printf("We like to think that:\n");
    /* characters */
    EXPECT("00 we have ASCII",('A'==65));
    EXPECT("01 A-Z is in a block",('Z'-'A')+1==26);
    EXPECT("02 big letters come before small letters",('A'<'a'));
    EXPECT("03 a char is 8 bits",CHAR_BIT==8);
    EXPECT("04 a char is signed",CHAR_MIN==SCHAR_MIN);

    /* integers */
    EXPECT("05 int has the size of pointers",sizeof(int)==sizeof(void*));
    /* not true for Windows-64 */
    EXPECT("05a long has at least the size of pointers",sizeof(long)>=sizeof(void*));

    EXPECT("06 integers are 2-complement and wrap around",(int_max+1)==(int_min));
    EXPECT("07 integers are 2-complement and *always* wrap around",(INT_MAX+1)==(INT_MIN));
    EXPECT("08 overshifting is okay",(1<<bits_per_int)==0);
    EXPECT("09 overshifting is *always* okay",(1<<BITS_PER_INT)==0);
    {
        int t;
        EXPECT("09a minus shifts backwards",(t=-1,(15<<t)==7));
    }
    /* pointers */
    /* Suggested by jalf */
    EXPECT("10 void* can store function pointers",sizeof(void*)>=sizeof(void(*)()));
    /* execution */
    EXPECT("11 Detecting how the stack grows is easy",check_grow(5,0)!=0);
    EXPECT("12 the stack grows downwards",check_grow(5,0)<0);

    {
        int t;
        /* suggested by jk */
        EXPECT("13 The smallest bits always come first",(t=0x1234,0x34==*(char*)&t));
    }
    {
        /* Suggested by S.Lott */
        int a[2]={0,0};
        int i=0;
        EXPECT("14 i++ is strictly left to right",(i=0,a[i++]=i,a[0]==1));
    }
    {
        struct {
            char c;
            int i;
        } char_int;
        EXPECT("15 structs are packed",sizeof(char_int)==(sizeof(char)+sizeof(int)));
    }
    {
        EXPECT("16 malloc()=NULL means out of memory",(malloc(0)!=NULL));
    }

    /* suggested by David Thornley */
    EXPECT("17 size_t is unsigned int",sizeof(size_t)==sizeof(unsigned int));
    /* this is true for C99, but not for C90. */
    EXPECT("18 a%b has the same sign as a",((-10%3)==-1) && ((10%-3)==1));

    /* suggested by nos */
    EXPECT("19-1 char<short",sizeof(char)<sizeof(short));
    EXPECT("19-2 short<int",sizeof(short)<sizeof(int));
    EXPECT("19-3 int<long",sizeof(int)<sizeof(long));
    EXPECT("20 ptrdiff_t and size_t have the same size",(sizeof(ptrdiff_t)==sizeof(size_t)));
#if 0
    {
        /* suggested by R. */
        /* this crashed on TC 3.0++, compact. */
        char buf[10];
        EXPECT("21 You can use snprintf to append a string",
               (snprintf(buf,10,"OK"),snprintf(buf,10,"%s!!",buf),strcmp(buf,"OK!!")==0));
    }
#endif

    EXPECT("21 Evaluation is left to right",
           (ltr_fun(1)*ltr_fun(2)*ltr_fun(3)*ltr_fun(4),ltr_result==1234));

    {
    #ifdef __STDC_IEC_559__
    int STDC_IEC_559_is_defined=1;
    #else 
    /* This either means, there is no FP support
     *or* the compiler is not C99 enough to define  __STDC_IEC_559__
     *or* the FP support is not IEEE compliant. */
    int STDC_IEC_559_is_defined=0;
    #endif
    EXPECT("22 floating point is always IEEE",STDC_IEC_559_is_defined);
    }

    printf("From what I can say with my puny test cases, you are %d%% mainstream\n",100-(100*count)/total);
    return 0;
}

ওহ, এবং আমি এই সম্প্রদায়টি শুরু থেকেই উইকি তৈরি করেছি কারণ আমি অনুভব করেছি যে লোকেরা যখন এটি পড়বে তখন আমার ব্লাবারটি সম্পাদনা করতে চায়।

আপডেট আপনার ইনপুট জন্য ধন্যবাদ। আমি আপনার উত্তরগুলি থেকে কয়েকটি কেস যুক্ত করেছি এবং দেখব গ্রেগের পরামর্শ মতো আমি এর জন্য একটি গিথব স্থাপন করতে পারি কিনা।

আপডেট : আমি এর জন্য একটি গিথুব রেপো তৈরি করেছি, ফাইলটি "getcha.c":

দয়া করে এখানে প্যাচগুলি বা নতুন ধারণাগুলি দিয়ে উত্তর দিন, যাতে সেগুলি এখানে আলোচনা করা বা স্পষ্ট করা যায়। আমি তখন সেগুলি getcha.c তে মিশ্রিত করব।


7
ডসের মাঝারি মডেলটি বিবেচনা করুন। ফাংশনগুলি একাধিক বিভাগে সংরক্ষণ করা যায়, সুতরাং একটি ফাংশন পয়েন্টারটি 32 বিট দীর্ঘ। তবে আপনার ডেটা কেবলমাত্র একক সেগমেন্টে সংরক্ষণ করা হয়েছে, সুতরাং ডেটা পয়েন্টারগুলি কেবলমাত্র 16 বিট দীর্ঘ। অকার্যকর * যেহেতু ডেটা পয়েন্টার, এটি 16 বিট প্রশস্ত, সুতরাং আপনি কোনওটিতে একটি ফাংশন পয়েন্টার ফিট করতে পারবেন না। C-jump.com/CIS77/ASM/Directives/D77_0030_models.htm দেখুন ।
ডেভিড

6
সম্ভবত আপনি এই কোডটি github.com বা অন্য কিছুতে ফেলে দিতে পারেন এবং লোকেরা সহজেই প্যাচগুলি অবদান রাখতে পারে।
গ্রেগ হিউগিল

1
এখানে প্রচুর জিনিসগুলিতে সহায়তা করা উচিত: স্ট্যাকওভারফ্লো.com
মার্টিন ইয়র্ক

4
পসিক্সের প্রয়োজন যে ফাংশন পয়েন্টারগুলিকে অকার্যকর * এর মতো একই উপস্থাপনা থাকতে পারে এবং কোনও তথ্য ক্ষতির পরিবর্তে (একটি কাস্ট দিয়ে) রূপান্তর করা যায়। এর অন্যতম কারণ হ'ল dlsym()শূন্য * প্রদান করে তবে এটি ডেটা এবং ফাংশন পয়েন্টার উভয়ের জন্যই। সুতরাং এটির উপর নির্ভর করা এত খারাপ নাও হতে পারে।
জিলিস

3
@ ত্রিস্টোপিয়া: পয়েন্ট 15 এখানে রয়েছে, কারণ অনেক শিক্ষানবিশরা প্রায়শই অবাক হয়ে জানতে পারেন যে ডেটা অবিচ্ছিন্নভাবে প্যাক করা হয় না বরং পরিবর্তে নির্দিষ্ট গণ্ডিতে আবদ্ধ থাকে। সদস্য অর্ডার পরিবর্তন করে এবং বিভিন্ন বস্তুর আকার পেলে তারা বিস্মিত হয়। এছাড়াও, অনেক সমসাময়িক মাইক্রো কন্ট্রোলার বা এম্বেড থাকা ডিভাইসগুলির সাথে প্যাকিং হ'ল ডিফল্ট মোড। আমার এভিআর আতমেগা এবং টার্বোসি / এমএসডোস আউটপুটটিও প্যাক করা আছে। এমএসডোস এখনও শিল্প প্রয়োগে ব্যবহৃত হয়।
নর্ডিক মেনফ্রেম

উত্তর:


91

সমেত এক্সপ্রেসশনগুলির মূল্যায়নের ক্রম

  • একটি ফাংশন কল এবং
  • অপারেটরদের operands (যেমন, +, -, =, *, /), বাদ দিয়ে:
    • বাইনারি লজিকাল অপারেটর ( &&এবং ||),
    • টেরিনারি শর্তসাপেক্ষ অপারেটর ( ?:), এবং
    • কমা অপারেটর ( ,)

হয় অনির্দিষ্ট

উদাহরণ স্বরূপ

  int Hello()
  {
       return printf("Hello"); /* printf() returns the number of 
                                  characters successfully printed by it
                               */
  }

  int World()
  {
       return printf("World !");
  }

  int main()
  {

      int a = Hello() + World(); //might print Hello World! or World! Hello
      /**             ^
                      | 
                Functions can be called in either order
      **/
      return 0;
  } 

1
আমি সর্বদা এটি জানতাম যে ফাংশন প্যারামিটারগুলি সম্পর্কে, তবে অপারেটরগুলির ক্ষেত্রে আমি এটির কথা কখনও ভাবি নি ... ... এবং যদি আমি কখনও আপনাকে উত্পাদন পরিবেশে এমন কোড লিখতে দেখি তবে আমি আপনাকে একটি ভেজা নুডল দিয়ে চড় মারব।
রিওয়ালক

3
@ বিলি: তবে কেবল অপারেটরদের আদিম সংস্করণগুলির জন্য।
ডেনিস জিকিফুজ

1
@ ডেনিস: এটি সত্য। (এ কারণেই এগুলি কখনই ওভারলোড করা কার্যকর / বেশি কার্যকর সি ++ এর একটি আইটেম নেই (আপনি লেখালেখি না boost::spirit
করেই

1
@ ড্যানিয়েল: আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই। মনে হচ্ছে আপনি অপারেটরদের ওভারলোড করার জন্য এটি ঠিকঠাক পরামর্শ দিচ্ছেন কারণ এটি কেবল আপনার শ্রেণীর ব্যবহারকারীরা ভুল বুঝতে পারে এবং আপনি যদি সরাসরি সি ++ তে না লিখেন তবে তাতে কিছু আসে যায় না। যার কোনোটাই আদৌ কোনও ধারণা রাখে না।
ডেনিস জিকিফুজ

2
@ ইউজার ৪২০৫36:: আচরণটি কেবল অনির্ধারিত তবে সংজ্ঞায়িত নয়। হ্যাঁ উদাহরণটি হ্যালো ওয়ার্ল্ড প্রিন্ট করতে পারে! বা বিশ্ব! হ্যালো তবে এটি কেবলই অনির্দিষ্ট +। এটি এর মতো কোনও ক্রম বিন্দু নিয়ম লঙ্ঘন করে না ।
প্রসূন সৌরভ

38

sdcc 29.7 / ucSim / Z80

We like to think that:
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..19-2 short<int
   but 'sizeof(short)<sizeof(int)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
..25 pointer arithmetic works outside arrays
   but '(diff=&var.int2-&var.int1, &var.int1+diff==&var.int2)' is false.
From what I can say with my puny test cases, you are Stop at 0x0013f3: (106) Invalid instruction 0x00dd

মুদ্রণযোগ্য ক্রাশ। "O_O"


gcc 4.4@x86_64-suse-linux

We like to think that:
..05 int has the size of pointers
but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..14 i++ is strictly left to right
but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..26 sizeof() does not evaluate its arguments
but '(i=10,sizeof(char[((i=20),10)]),i==10)' is false.
From what I can say with my puny test cases, you are 79% mainstream

gcc 4.4@x86_64-suse-linux (-O2)

We like to think that:
..05 int has the size of pointers
but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
but '(1<<bits_per_int)==0' is false.
..14 i++ is strictly left to right
but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..26 sizeof() does not evaluate its arguments
but '(i=10,sizeof(char[((i=20),10)]),i==10)' is false.
From what I can say with my puny test cases, you are 82% mainstream

ঝাঁকুনি 2.7@x86_64-suse-linux

We like to think that:
..05 int has the size of pointers
but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..14 i++ is strictly left to right
but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..21a Function Arguments are evaluated right to left
but '(gobble_args(0,ltr_fun(1),ltr_fun(2),ltr_fun(3),ltr_fun(4)),ltr_result==4321)' is false.
ltr_result is 1234 in this case
..25a pointer arithmetic works outside arrays
but '(diff=&p1-&p2, &p2+diff==&p1)' is false.
..26 sizeof() does not evaluate its arguments
but '(i=10,sizeof(char[((i=20),10)]),i==10)' is false.
From what I can say with my puny test cases, you are 72% mainstream

ওপেন64 4.2.3@x86_64-suse-linux

We like to think that:
..05 int has the size of pointers
but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..15 structs are packed
but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..21a Function Arguments are evaluated right to left
but '(gobble_args(0,ltr_fun(1),ltr_fun(2),ltr_fun(3),ltr_fun(4)),ltr_result==4321)' is false.
ltr_result is 1234 in this case
..25a pointer arithmetic works outside arrays
but '(diff=&p1-&p2, &p2+diff==&p1)' is false.
..26 sizeof() does not evaluate its arguments
but '(i=10,sizeof(char[((i=20),10)]),i==10)' is false.
From what I can say with my puny test cases, you are 75% mainstream

ইন্টেল 11.1@x86_64-suse-linux

We like to think that:
..05 int has the size of pointers
but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..14 i++ is strictly left to right
but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..21a Function Arguments are evaluated right to left
but '(gobble_args(0,ltr_fun(1),ltr_fun(2),ltr_fun(3),ltr_fun(4)),ltr_result==4321)' is false.
ltr_result is 1234 in this case
..26 sizeof() does not evaluate its arguments
but '(i=10,sizeof(char[((i=20),10)]),i==10)' is false.
From what I can say with my puny test cases, you are 75% mainstream

টার্বো সি ++ / ডস / ছোট স্মৃতি

We like to think that:
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..16 malloc()=NULL means out of memory
but '(malloc(0)!=NULL)' is false.
..19-2 short<int
but 'sizeof(short)<sizeof(int)' is false.
..22 floating point is always IEEE
but 'STDC_IEC_559_is_defined' is false.
..25 pointer arithmetic works outside arrays
but '(diff=&var.int2-&var.int1, &var.int1+diff==&var.int2)' is false.
..25a pointer arithmetic works outside arrays
but '(diff=&p1-&p2, &p2+diff==&p1)' is false.
From what I can say with my puny test cases, you are 81% mainstream

টার্বো সি ++ / ডস / মিডিয়াম মেমোরি

We like to think that:
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..10 void* can store function pointers
but 'sizeof(void*)>=sizeof(void(*)())' is false.
..16 malloc()=NULL means out of memory
but '(malloc(0)!=NULL)' is false.
..19-2 short<int
but 'sizeof(short)<sizeof(int)' is false.
..22 floating point is always IEEE
but 'STDC_IEC_559_is_defined' is false.
..25 pointer arithmetic works outside arrays
but '(diff=&var.int2-&var.int1, &var.int1+diff==&var.int2)' is false.
..25a pointer arithmetic works outside arrays
but '(diff=&p1-&p2, &p2+diff==&p1)' is false.
From what I can say with my puny test cases, you are 78% mainstream

টার্বো সি ++ / ডস / কমপ্যাক্ট মেমোরি

We like to think that:
..05 int has the size of pointers
but 'sizeof(int)==sizeof(void*)' is false.
..09a minus shifts backwards
but '(t=-1,(15<<t)==7)' is false.
..16 malloc()=NULL means out of memory
but '(malloc(0)!=NULL)' is false.
..19-2 short<int
but 'sizeof(short)<sizeof(int)' is false.
..20 ptrdiff_t and size_t have the same size
but '(sizeof(ptrdiff_t)==sizeof(size_t))' is false.
..22 floating point is always IEEE
but 'STDC_IEC_559_is_defined' is false.
..25 pointer arithmetic works outside arrays
but '(diff=&var.int2-&var.int1, &var.int1+diff==&var.int2)' is false.
..25a pointer arithmetic works outside arrays
but '(diff=&p1-&p2, &p2+diff==&p1)' is false.
From what I can say with my puny test cases, you are 75% mainstream

cl65 @ কমোডোর পিইটি (ভাইস এমুলেটর)

বিকল্প পাঠ


আমি এগুলি পরে আপডেট করব:


উইন্ডোজ এক্সপিতে বোরল্যান্ড সি ++ নির্মাতা 6.0

..04 a char is signed
   but 'CHAR_MIN==SCHAR_MIN' is false.
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09 overshifting is *always* okay
   but '(1<<BITS_PER_INT)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..16 malloc()=NULL means out of memory
   but '(malloc(0)!=NULL)' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 71% mainstream

ভিজ্যুয়াল স্টুডিও এক্সপ্রেস 2010 সি ++ সিএলআর, উইন্ডোজ 7 64 বিট

(সিএলআর সংকলক খাঁটি সি সমর্থন করে না কারণ অবশ্যই সি ++ হিসাবে সংকলন করা উচিত)

We like to think that:
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..14 i++ is structly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 78% mainstream

মিংডব্লিউ 6464 (জিসিসি -৪.৪.২ পূর্বরূপ)

- http://mingw-w64.sourceforge.net/

We like to think that:
..05 int has the size of pointers
   but 'sizeof(int)==sizeof(void*)' is false.
..05a long has at least the size of pointers
   but 'sizeof(long)>=sizeof(void*)' is false.
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..14 i++ is structly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
   but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 67% mainstream

Bit৪ বিট উইন্ডোজ এলএলপি 64৪ মডেল ব্যবহার করে: উভয়ই intএবং long32-বিট হিসাবে সংজ্ঞায়িত করা হয় যার অর্থ একটি পয়েন্টারের পক্ষে যথেষ্ট দীর্ঘ নয়।


avr-gcc 4.3.2 / এটিমেগা 168 (আরডুইনো ডাইসিমালা)

ব্যর্থ অনুমানগুলি হ'ল:

..14 i++ is structly left to right
..16 malloc()=NULL means out of memory
..19-2 short<int
..21 Evaluation is left to right
..22 floating point is always IEEE

এটমেগা 168 এ 16 বিট পিসি রয়েছে তবে কোড এবং ডেটা পৃথক ঠিকানার স্পেসে রয়েছে। বৃহত্তর আতমেগাসে 22 বিট পিসি রয়েছে!


জিসিসি 4.2.1 ম্যাকোএসএক্স 10.6 এ -আরচ পিপিসি দিয়ে সংকলিত

We like to think that:
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..13 The smallest bits come always first
   but '(t=0x1234,0x34==*(char*)&t)' is false.
..14 i++ is structly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 78% mainstream


32
এবং আপনি অন্য একটি ধারণা অনুধাবন করেছেন: আপনি একটি টার্মিনাল লাইনে 80 টি অক্ষর ফিট করতে পারেন।
মাইক সিমুর

3
sizeof(void*)>=sizeof(void(*)())== এর চেয়ে বেশি প্রাসঙ্গিক হবে। আমাদের কেবল যত্নশীল হ'ল "আমরা কী একটি শূন্য পয়েন্টার মধ্যে একটি ফাংশন পয়েন্টার সংরক্ষণ করতে পারি", সুতরাং আপনার যে অনুমানটি পরীক্ষা করতে হবে তা void*হ'ল একটি কমপক্ষে ফাংশন পয়েন্টারের চেয়ে বড় কিনা ।
jalf

1
যদি আপনার পরিবেশটি পসিক্স -অনুবর্তী হয় তবে আপনার সাথে ঠিক থাকা উচিত sizeof(void*)>=sizeof(void(*)())- দেখুন ওপেনগ্রুপ.org
ড্যানিয়েল আর্উইকার

26

অনেক দিন আগে, আমি একটি পাঠ্যপুস্তক থেকে সি পড়ছিলাম

printf("sizeof(int)=%d\n", sizeof(int));

একটি নমুনা প্রশ্ন হিসাবে। এটি একটি শিক্ষার্থীর জন্য ব্যর্থ হয়েছিল, কারণ sizeofপ্রকারের মানের ফলন হয় size_tনা int, intএই বাস্তবায়নে 16 বিট size_tছিল এবং 32 বছর ছিল এবং এটি বড়-এন্ডিয়ান ছিল। (প্ল্যাটফর্মটি 680x0-ভিত্তিক ম্যাকিনটোসগুলিতে লাইটস্পিড সি ছিল I আমি বলেছিলাম এটি অনেক আগে ছিল))


7
এই ধরণের ত্রুটিযুক্ত ত্রুটিগুলির মধ্যে একটি সাধারণ এবং সাধারণভাবে উপেক্ষা করার জন্য +1।
আর .. গীটহাব বন্ধ করুন ICE

4
এটি 64৪-বিট সিস্টেমেও ঘটে, যেখানে সাইজ_টি bit৪ বিট এবং ইনটগুলি প্রায় সর্বদা সংক্ষিপ্ত থাকে। উইন 6464 এখনও অযৌক্তিক, কারণ unsigned long longসেখানে সাইজ_টি রয়েছে। টেস্ট 17 হিসাবে যুক্ত হয়েছে
নর্ডিক মেনফ্রেম

দুর্ভাগ্যক্রমে, মাইক্রোসফ্টের সি রানটাইম আকারযুক্ত পূর্ণসংখ্যার zজন্য সংশোধকটিকে সমর্থন করে না size_tএবং long longকিছু প্ল্যাটফর্মগুলিতেও সমর্থন করে না। সুতরাং কোনও বস্তুর মুদ্রিত আকার ফর্ম্যাট বা কাস্ট করার কোনও নিরাপদ পোর্টেবল উপায় নেই।
ফিল মিলার

15

আপনার দ্বারা লোকেরা তৈরি করা ++এবং --অনুমানগুলি অন্তর্ভুক্ত করতে হবে।

a[i++]= i;

উদাহরণস্বরূপ, সিনথেটিকভাবে আইনী, তবে যুক্তিযুক্ত অনেকগুলি বিষয়ের উপর নির্ভর করে বিভিন্ন ফলাফল তৈরি করে।

যে কোনও বিবৃতি ++(বা --) এবং একটি পরিবর্তনশীল যা একাধিকবার ঘটে তা সমস্যা।


এবং এটি ঠিক যেমন একটি সাধারণ প্রশ্ন!
ম্যাথিউ এম।

8

খুব আকর্ষণীয়!

অন্যান্য জিনিস আমি এটির জন্য চিন্তা করতে পারি এটি চেক করা কার্যকর হতে পারে:

  • একই ঠিকানা জায়গাতে ফাংশন পয়েন্টার এবং ডেটা পয়েন্টারগুলি বিদ্যমান? (হার্ভার্ড আর্কিটেকচার মেশিনে ডস ছোট মোডের মতো বিরতি though

  • যদি আপনি কোনও NULL ডেটা পয়েন্টার নেন এবং এটি যথাযথ পূর্ণসংখ্যার ধরণে ফেলে দেন, তবে এটির সংখ্যার মান 0 হবে? (কিছু সত্যই প্রাচীন মেশিনে বিরতি --- দেখুন http://c-faq.com/null/machexamp.html ।) ফাংশন পয়েন্টার সহ ডিট্টো। এছাড়াও, তারা বিভিন্ন মান হতে পারে।

  • এর সাথে সম্পর্কিত স্টোরেজ অবজেক্টের শেষের দিকে কোনও পয়েন্টার বাড়ানো এবং তারপরে আবারও, বুদ্ধিমান ফলাফলের কারণ হয়? (আমি আসলে কোনও মেশিনই জানি না যা এটি প্রকৃতপক্ষে ভেঙে যায় তবে আমি বিশ্বাস করি যে সি স্পেক আপনাকে এমন পয়েন্টার সম্পর্কেও ভাবতে দেয় না যা (ক) অ্যারের সামগ্রী বা (খ) উপাদানটির দিকেও নির্দেশ করে না অ্যারে বা তত্ক্ষণাত্ (গ) নুল। http://c-faq.com/aryptr/non0based.html দেখুন )

  • <এবং> এর সাথে বিভিন্ন স্টোরেজ অবজেক্টের সাথে দুটি পয়েন্টারের তুলনা করলে ধারাবাহিক ফলাফল পাওয়া যায়? (আমি বহিরাগত সেগমেন্ট-ভিত্তিক মেশিনে এই বিরতি কল্পনা করতে পারি; স্পেকটি এই ধরনের তুলনা করতে নিষেধ করে, তাই সংকলকটি কেবলমাত্র পয়েন্টারের অফসেট অংশটি তুলনা করার অধিকারী হবে, সেগমেন্ট অংশটি নয়।)

হুম। আমি চেষ্টা করব এবং আরও কিছু সম্পর্কে চিন্তা করব।

সম্পাদনা: চমত্কার সি এফএকিউতে কিছু স্পষ্টকারী লিঙ্ক যুক্ত হয়েছে।


2
ঘটনাক্রমে, কিছুক্ষণ আগে আমি ক্লু ( cluecc.sourceforge.net ) নামে একটি পরীক্ষামূলক প্রকল্প করেছি যা আপনাকে লুয়া, জাভাস্ক্রিপ্ট, পার্ল, এলআইএসপি ইত্যাদিতে সি সংকলন করতে দিয়েছিল এটি সি স্ট্যান্ডার্ডের নির্ধারিত আচরণটিকে পয়েন্টারগুলির কাজ করার জন্য নির্মমভাবে ব্যবহার করেছিল ited । এটির উপর এই পরীক্ষাটি চেষ্টা করা আকর্ষণীয় হতে পারে।
ডেভিড

1
আইআইআরসি সি আপনাকে অবজেক্টের শেষের বাইরে 1 দ্বারা পয়েন্টার বাড়ানোর অনুমতি দেয় তবে এর চেয়ে আরও বেশি নয়। তবে কোনও বস্তুর শুরুর আগে একটি অবস্থানে এটি হ্রাস করার অনুমতি নেই।
আর .. গীটহাব বন্ধ করুন ICE

@R। সি ++ তেও একই। এবং সিপিইউতে পয়েন্টার বাড়ানো যদি একটি অতিরিক্ত প্রবাহের কারণ হয়ে থাকে তবে আরও বৃদ্ধি বাড়তে পারে যা পয়েন্টারগুলিকে কেবল পূর্ণসংখ্যা হিসাবে বিবেচনা করে না।
জালফ

5

আমি মনে করি আপনার "ভুল" অনুমানের দুটি খুব পৃথক শ্রেণীর মধ্যে পার্থক্য করার চেষ্টা করা উচিত। একটি ভাল অর্ধ (ডান শিফট এবং সাইন এক্সটেনশান, ASCII- সামঞ্জস্যপূর্ণ এনকোডিং, মেমরি লিনিয়ার, ডেটা এবং ফাংশন পয়েন্টার সামঞ্জস্যপূর্ণ ইত্যাদি) বেশিরভাগ সি কোডার তৈরি করার জন্য বেশ যুক্তিসঙ্গত অনুমান এবং এমনকি এটি স্ট্যান্ডার্ডের অংশ হিসাবে অন্তর্ভুক্ত থাকতে পারে যদি সি আজ ডিজাইন করা হচ্ছিল এবং যদি আমাদের লিবিসি আইবিএম জাঙ্ক গ্র্যান্ডফ্রেড-ইন না থাকে। অন্যান্য অর্ধেক (মেমরি অ্যালিজিং সম্পর্কিত জিনিসগুলি, ইনপুট এবং আউটপুট মেমরির ওভারল্যাপ করার সময় লাইব্রেরি ফাংশনের আচরণ, সেই পয়েন্টারগুলির মতো 32-বিট অনুমান intবা আপনি ব্যবহার করতে পারেনmalloc প্রোটোটাইপ ব্যতীত, কলিং কনভেনশনটি বৈকল্পিক এবং অ-বৈচিত্রপূর্ণ ফাংশনগুলির জন্য অভিন্ন, ...) আধুনিকীকরণকারীরা perform৪-বিট মেশিনে বা অন্য নতুন প্রযুক্তিতে মাইগ্রেশনের সাথে অপ্টিমাইজেশনের সাথে দ্বন্দ্ব করতে পারে।


এটি কেবলমাত্র "আইবিএম জাঙ্ক" নয় (যদিও আমি সম্মত করি আইবিএম স্টাফ জাঙ্ক)। অনেক এম্বেড থাকা সিস্টেমে আজ একই সমস্যা রয়েছে have
rmeadora

স্পষ্ট করে mallocবলতে গেলে, প্রোটোটাইপ ব্যতীত ব্যবহারের অর্থ অন্তর্ভুক্ত নয় <stdlib.h>, যার ফলে mallocডিফল্ট হয়ে যায় int malloc(int), যদি আপনি 64৪-বিট সমর্থন করতে চান তবে একটি নো।
জোয়ে অ্যাডামস

প্রযুক্তিগতভাবে আপনি <stdlib.h>আর কোনও শিরোনামকে সংজ্ঞায়িত করতে না পারছেন যা আপনাকে সংজ্ঞায়িত করে size_tএবং তারপরে আপনি mallocএকটি সঠিক প্রোটোটাইপ দিয়ে নিজেকে ঘোষণা করেন।
আর .. গিটহাব বন্ধ করুন ICE

5

এখানে একটি মজাদার: এই ফাংশনটিতে কী দোষ আছে?

float sum(unsigned int n, ...)
{
    float v = 0;
    va_list ap;
    va_start(ap, n);
    while (n--)
        v += va_arg(ap, float);
    va_end(ap);
    return v;
}

[উত্তর (রট ১৩): ইনভেনকভিপি নেট্জরাগফ বোর্ল গুর বাইক এক্স অ্যান্ড ই সেবজবগভিবা এহিরফ, জুভপু জর্নাফ এলবিএইচ pnaabg এইচফআর 'সিবং' (হতে হবে 'পুণে' হতে হবে 'ফুবেগ') ভাই ইন_নেট! নাক গুর পিবিজক্ভিয়ের ভিএফ এরধেরিক অ্যাবজি জিবি জার্মান্ গুভ্ফ এনএফ এন পিবিজসিভিয়ার-জিভিজার রিবে। (টিপিপি কিউবিআরএফ আরজেভিজি এন জেনেভাট, গুভতু।)]


ওহ, এটি একটি ভাল। ঝাঁকুনি 2.7 এটি খায় এবং কোনও সতর্কতা ছাড়াই সম্পূর্ণ বোকা উত্পাদন করে।
নর্ডিক মেনফ্রেম

va_arg প্রসারিত হয় যদি এটি ম্যাক্রো হয় এবং লুপটি কেবল প্রথম বিবৃতিটি কার্যকর করে, সম্ভবত অনেকের?
Maister

নাহ (যদি এটি হয়ে থাকে তবে এটি বাস্তবায়নে একটি বাগ হবে)।
zwol

5
EXPECT("## pow() gives exact results for integer arguments", pow(2, 4) == 16);

অন্য একটি পাঠ্য মোড সম্পর্কে fopen। বেশিরভাগ প্রোগ্রামাররা ধরে নিলেন যে পাঠ্য এবং বাইনারি উভয়ই একই (ইউনিক্স) বা সেই পাঠ্য মোডে \rঅক্ষর (উইন্ডোজ) যুক্ত হয়। তবে সি এমন সিস্টেমে পোর্ট করা হয়েছে যা নির্দিষ্ট-প্রস্থের রেকর্ড ব্যবহার করে, যার fputc('\n', file)উপর কোনও পাঠ্য ফাইলের অর্থ ফাঁকা জায়গা বা কোনও কিছু যুক্ত করা অবধি ফাইলের আকার রেকর্ড দৈর্ঘ্যের একাধিক না হওয়া পর্যন্ত।

এবং এখানে আমার ফলাফল:

জিসিসি (উবুন্টু 4.4.3-4ubuntu5) 4.4.3 x86-64 এ

We like to think that:
..05 int has the size of pointers
   but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..14 i++ is strictly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
   but 'sizeof(size_t)==sizeof(unsigned int)' is false.
From what I can say with my puny test cases, you are 78% mainstream

আমি আসলে কোডটি দেখেছি যা pow(2, n)বিট ক্রিয়াকলাপের সাথে মিলিত হয়েছে ।
dan04

4

তাদের মধ্যে কিছু সহজেই সি এর অভ্যন্তর থেকে পরীক্ষা করা যায় না কারণ এই প্রোগ্রামটি এমন বাস্তবায়নগুলিতে ক্রাশ হওয়ার সম্ভাবনা রয়েছে যেখানে অনুমানটি ধারণ করে না।


"পয়েন্টার-মূল্যবান ভেরিয়েবলের সাথে কিছু করা ঠিক আছে। এটির বৈধ পয়েন্টার মানটি অন্তর্ভুক্ত করা দরকার যদি আপনি এটিকে অবলম্বন করেন" "

void noop(void *p); /* A no-op function that the compiler doesn't know to optimize away */
int main () {
    char *p = malloc(1);
    free(p);
    noop(p); /* may crash in implementations that verify pointer accesses */
    noop(p - 42000); /* and if not the previous instruction, maybe this one */
}

অবিচ্ছেদ্য এবং ভাসমান পয়েন্টের ধরণগুলির সাথে একই (অন্যটি unsigned char), যা ফাঁদ উপস্থাপনের জন্য অনুমোদিত।


"পূর্ণসংখ্যার গণনাগুলি প্রায় মোড়ানো So সুতরাং এই প্রোগ্রামটি একটি বড় নেতিবাচক পূর্ণসংখ্যাকে প্রিন্ট করে।"

#include <stdio.h>
int main () {
    printf("%d\n", INT_MAX+1); /* may crash due to signed integer overflow */
    return 0;
}

(কেবলমাত্র C89)) "শেষের দিকে পড়া ঠিক আছে main" "

#include <stdio.h>
int main () {
    puts("Hello.");
} /* The status code is 7 on many implementations. */

2
একটি কংক্রিট উদাহরণ হিসাবে: সংকলিত হয়ে gcc -ftrapv -Oগেলে আউটপুটটি We like to think that:অনুসরণ করা হয়Aborted
ক্যাফ

@caf: "এই বিকল্পটি যোগ, বিয়োগ, গুণ এবং অপারেশনে স্বাক্ষরিত ওভারফ্লোর জন্য ফাঁদ তৈরি করে" " ভালো লাগল, ধন্যবাদ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
শেষটি সি ++ (98, 03 এবং 0x)
তেও

যা দুষ্টু কারণ প্রাক-এএনএসআই সি এটির অনুমতি দেয় এবং সি 99 পাশাপাশি করে।
জোশুয়া

@ জোশুয়া: এএফআইএকি-তে mainকোনও মূল্য ছাড়াই প্রত্যাবর্তনে প্রাক-এএনএসআই সি এবং সি 89 এর মধ্যে কোনও পার্থক্য নেই: প্রোগ্রামটি সঠিক তবে একটি অপরিজ্ঞাত সমাপ্তি স্থিতি (সি 98 §2.1.2.2) প্রদান করে। অনেকগুলি বাস্তবায়ন (যেমন জিসিসি এবং পুরানো ইউনিক্স সংকলক) সহ আপনি সেই সময়ে নির্দিষ্ট রেজিস্ট্রারে যা কিছু পান তা পেয়ে যান। প্রোগ্রামটি সাধারণত কোনও মেকফিল বা অন্য পরিবেশে ব্যবহার না করা অবধি কাজ করে যা সমাপ্তির স্থিতি পরীক্ষা করে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

4

ভাল ক্লাসিক বহনযোগ্যতা অনুমান এখনও বোঝানো হয় নি

  • অবিচ্ছেদ্য ধরণের আকার সম্পর্কে অনুমান
  • endianness

4
"একটি অন্তর্নিহিততা রয়েছে" সহ "এন্ডিয়ানেশন": এখানে মধ্য-এন্ডিয়ান মেশিন রয়েছে এবং স্ট্যান্ডার্ডটি shortদুটি বাইট 0248ace এবং fdb97531 হিসাবে দুটি মানের বেকড হিসাবে fedcab9876543210 (এটি 16 বাইনারি অঙ্ক) সংরক্ষণ করার মতো অদ্ভুত জিনিসকে অনুমতি দেয় ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

হ্যাঁ এন্ডিয়নেসিতে অবশ্যই মিশ্র / মিডল এডিয়ান পাশাপাশি বড় এবং সামান্য অন্তর্ভুক্ত থাকে। আপনি যদি কাস্টম হার্ডওয়ারে যান তবে যে কোনও বাসে আপনার পছন্দসই পছন্দ থাকতে পারে।
জে কে।

মিডল এন্ডিয়ান পিডিপি এন্ডিয়ান হিসাবে পরিচিত। গিলেস এমনকি অযৌক্তিক কিছু ঘোষণা করে যদিও এটি টিসিপি / আইপি বাস্তবায়নের জন্য মাথা ব্যথা করে।
জোশুয়া

@ গিলস: মিডিল-এন্ডিয়ান ... আমি খুব আনন্দিত যে আমি সেটির উপরে বিকাশ করছি না। (তবে এখন আমি একটি মিডিল-এডিয়ান নেটওয়ার্কিং প্রকল্প করতে বলব, আমি নিশ্চিত) ...
পল নাথান

এআরএম এফপিই মিডল এন্ডিয়ান ডাবল ব্যবহার করেছে, যেখানে সেগুলিকে <হাই কোয়াড> <লো কোয়াড> জুটি হিসাবে সংরক্ষণ করা হয়েছিল তবে প্রতিটি কোয়াডের অভ্যন্তরে বিটের ক্রমটি ছিল ভুল পথে গোল। (ধন্যবাদ, এআরএম ভিএফপি আর এটি করে না))
ডেভিড দেওয়া হয়েছে

4
  • ভাসমান পয়েন্ট উপস্থাপনের কারণে বিবেচনার ত্রুটি। উদাহরণস্বরূপ, আপনি যদি চতুর্ভুজ সমীকরণগুলি সমাধানের জন্য আদর্শ সূত্র বা আনুমানিক ডেরিভেটিভগুলির সীমাবদ্ধ পার্থক্যগুলি বা বৈকল্পগুলি গণনা করার জন্য আদর্শ সূত্র ব্যবহার করেন তবে সিম্পিরিং সংখ্যার মধ্যে পার্থক্যের গণনার কারণে নির্ভুলতা নষ্ট হবে। লিনিয়ার সিস্টেমগুলি সমাধান করার জন্য গাউ অ্যালগরিদম খারাপ কারণ বৃত্তাকার ত্রুটিগুলি জমে থাকে, সুতরাং কেউ কিউআর বা এলইউ পচে যাওয়া, কোলেস্কি পচন, এসভিডি ইত্যাদির ব্যবহার করে তবে ভাসমান পয়েন্ট সংখ্যা সংযোজনমূলক নয়। এখানে অস্বীকৃতি, অসীম এবং NaN মান রয়েছে। a + b - ab

  • স্ট্রিংস: অক্ষর, কোড পয়েন্ট এবং কোড ইউনিটের মধ্যে পার্থক্য। ইউনিকোড বিভিন্ন অপারেটিং সিস্টেমে কীভাবে প্রয়োগ করা হয়; ইউনিকোড এনকোডিংস। পোর্টেবল উপায়ে সি ++ দিয়ে একটি স্বেচ্ছাসেবী ইউনিকোড ফাইল নাম দিয়ে একটি ফাইল খোলা সম্ভব নয়।

  • এমনকি থ্রেডিং ছাড়াই রেসের শর্তাদি: আপনি যদি ফাইলটি বিদ্যমান কিনা তা পরীক্ষা করে নিলে ফলাফল যে কোনও সময় অবৈধ হতে পারে।

  • ERROR_SUCCESS = 0


4

পূর্ণসংখ্যার আকারগুলির জন্য একটি চেক অন্তর্ভুক্ত করুন। বেশিরভাগ লোক ধরে ধরেছেন যে কোনও সংক্ষিপ্তের চেয়ে বড় একটি চরের চেয়ে বড়। যাইহোক, এগুলি সমস্ত মিথ্যা হতে পারে:sizeof(char) < sizeof(int); sizeof(short) < sizeof(int); sizeof(char) < sizeof(short)

এই কোডটি ব্যর্থ হতে পারে (স্বাক্ষরবিহীন অ্যাক্সেসে ক্র্যাশ)

unsigned char buf[64];

int i = 234;
int *p = &buf[1];
*p = i;
i = *p;

এই কোডটি কি সি ++ এ ব্যর্থ হবে? আইআইআরসি, সম্পর্কহীন প্রকারের মধ্যে পয়েন্টার কাস্ট করা অবৈধ, চরের * জন্য এক্সেসপটি, যা কোনও প্রকারে কাস্ট করা যেতে পারে (বা এটি অন্যভাবে?)
rmeador

1
আপনি কেবল int *p = (int*)&buf[1];সি ++ এ করতে পারেন, লোকেরা এটিও কাজ করবে বলে আশা করে।
টি

@ না, হ্যাঁ যে ব্যর্থ হতে পারে তবে ব্যর্থতা ক্রাশ হয় যাতে তার প্রোগ্রামটি এটির জন্য পরীক্ষা করতে পারে না। :(
জোশুয়া

1
sizeof(char) < sizeof(int)দরকার. উদাহরণস্বরূপ, fgetc () স্বাক্ষরবিহীন অক্ষরের চর হিসাবে মান হিসাবে প্রত্যাবর্তন করে, বা EOFযা নেতিবাচক মান। unsigned charপ্যাডিং বিটস নাও থাকতে পারে, তাই কেবলমাত্র চরের চেয়ে বড় ইন্ট্রি তৈরির মাধ্যমে এটি করা সম্ভব। এছাড়াও, (বেশিরভাগ সংস্করণে) সি স্পপের জন্য -32767..32767 রেঞ্জের যে কোনও মান একটি ইনট্রে সংরক্ষণ করা যেতে পারে।
জিলিস

@ আইলস এখনও, 32 বিট চর এবং 32 বিট ইনট সহ ডিএসপি রয়েছে।
টি

3

অন্তর্নির্মিত ডেটা ধরণের সম্পর্কে কয়েকটি জিনিস:

  • charএবং signed charপ্রকৃতপক্ষে দুটি স্বতন্ত্র ধরণের (বিপরীতে intএবং signed intযা একই স্বাক্ষরিত পূর্ণসংখ্যার প্রকারকে বোঝায়)।
  • স্বাক্ষরিত পূর্ণসংখ্যার দুটির পরিপূরক ব্যবহার করার প্রয়োজন হয় না। ওনসের পরিপূরক এবং চিহ্ন + মাত্রাটিও নেতিবাচক সংখ্যাগুলির বৈধ উপস্থাপনা। এই বিট ঋণাত্মক সংখ্যা জড়িত অপারেশন তোলে বাস্তবায়ন-সংজ্ঞায়িত
  • আপনি যদি একটি স্বাক্ষরিত পূর্ণসংখ্য পরিবর্তনশীলকে সীমার বাইরে পূর্ণসংখ্যা নির্ধারণ করেন, আচরণটি বাস্তবায়ন-সংজ্ঞায়িত
  • C90 এ, -3/5ফিরে আসতে পারে 0বা -1। এক অপারেন্ড নেতিবাচক হলে শূন্যের দিকে গোল করা কেবল সি 99 এর উপরে এবং সি ++ 0x উপরের দিকে গ্যারান্টিযুক্ত।
  • অন্তর্নির্মিত প্রকারের জন্য কোনও সঠিক আকারের গ্যারান্টি নেই। মান শুধুমাত্র সংক্ষিপ্ত প্রয়োজনীয়তা জুড়ে যেমন একটি intহয়েছে অন্তত 16 বিট একটি longহয়েছে অন্তত , 32 বিট একটি long longহয়েছে অন্তত 64 বিট। একটি floatকমপক্ষে 6 টি উল্লেখযোগ্য দশমিক সংখ্যা সঠিকভাবে উপস্থাপন করতে পারে। একটি doubleকমপক্ষে দশটি দশমিক অঙ্ককে সঠিকভাবে উপস্থাপন করতে পারে।
  • ভাসমান পয়েন্ট সংখ্যা উপস্থাপনের জন্য আইইইই 754 বাধ্যতামূলক নয়।

স্বীকার করা যায়, বেশিরভাগ মেশিনে আমাদের দু'জনের পরিপূরক এবং আইইইই 754 ফ্লোট থাকে।


আমি অবাক করে দিয়েছি যে সীমার পূর্ণসংখ্যার কার্যভার নির্ধারিত আচরণের পরিবর্তে বাস্তবায়ন-সংজ্ঞায়িত হওয়াতে এর মূল্য কী? কিছু প্ল্যাটফর্মে, এই জাতীয় প্রয়োজন সংকলককে অতিরিক্ত কোড তৈরি করতে বাধ্য করবে int mult(int a,int b) { return (long)a*b;}[উদাহরণস্বরূপ যদি int32 বিট হয় তবে নিবন্ধিত হয় এবং long64 হয়)। এই ধরনের প্রয়োজন ছাড়াই, দ্রুত প্রয়োগের "প্রাকৃতিক" আচরণটি সমান long l=mult(1000000,1000000);নির্ধারণ করবে , যদিও এটি একটির জন্য "অসম্ভব" মান । l1000000000000int
সুপারক্যাট

3

এটা কেমন:

কোনও ডেটা পয়েন্টার কখনও বৈধ ফাংশন পয়েন্টার হিসাবে একই হতে পারে।

এটি সমস্ত ফ্ল্যাট মডেল, এমএস-ডস টিন, লার্জি এবং বিশাল মডেলের ক্ষেত্রে সত্য, এমএস-ডস স্মল মডেলের জন্য মিথ্যা এবং মিডিয়াম এবং কমপ্যাক্ট মডেলের জন্য প্রায় সর্বদা মিথ্যা (লোড অ্যাড্রেসের উপর নির্ভর করে, আপনাকে সত্যিকারের পুরানো ডসের প্রয়োজন হবে এটি সত্য করুন)।

আমি এর জন্য পরীক্ষা লিখতে পারি না

এবং আরও খারাপ: ptrdiff_t এ কাস্ট করা পয়েন্টারগুলির সাথে তুলনা করা যেতে পারে। এমএস-ডস লার্জ মডেলের ক্ষেত্রে এটি সত্য নয় (LARGE এবং HUGE এর মধ্যে একমাত্র পার্থক্য হ'ল পয়েন্টারগুলিকে সাধারণকরণের জন্য সংকলক কোড যুক্ত করা হয়)।

আমি একটি পরীক্ষা লিখতে পারছি না কারণ এই পরিবেশটি যেখানে শক্তভাবে বোমা দেয় সেখানে 64K এর চেয়ে বেশি বাফার বরাদ্দ করা হয় না তাই কোডটি এটি প্রদর্শন করে যে এটি অন্য প্ল্যাটফর্মগুলিতে ক্রাশ হবে।

এই নির্দিষ্ট পরীক্ষাটি এখনকার এক অবিচ্ছিন্ন সিস্টেমে পাস করবে (লক্ষ্য করুন এটি মলোকের অভ্যন্তরের উপর নির্ভর করে):

  char *ptr1 = malloc(16);
  char *ptr2 = malloc(16);
  if ((ptrdiff_t)ptr2 - 0x20000 == (ptrdiff_t)ptr1)
      printf("We like to think that unrelated pointers are equality comparable when cast to the appropriate integer, but they're not.");

3

সম্পাদনা: প্রোগ্রামটির সর্বশেষ সংস্করণে আপডেট হয়েছে

সোলারিস-SPARC

জিসিসি ৩.৪..6 এ 32 বিট

We like to think that:
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09 overshifting is *always* okay
   but '(1<<BITS_PER_INT)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..13 The smallest bits always come first
   but '(t=0x1234,0x34==*(char*)&t)' is false.
..14 i++ is strictly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 72% mainstream

জিসিসি ৩.৪..6 এ bit৪ বিট

We like to think that:
..05 int has the size of pointers
   but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09 overshifting is *always* okay
   but '(1<<BITS_PER_INT)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..13 The smallest bits always come first
   but '(t=0x1234,0x34==*(char*)&t)' is false.
..14 i++ is strictly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
   but 'sizeof(size_t)==sizeof(unsigned int)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 68% mainstream

এবং সানস্টুডিও 11 32 বিট সহ

We like to think that:
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..13 The smallest bits always come first
   but '(t=0x1234,0x34==*(char*)&t)' is false.
..14 i++ is strictly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
From what I can say with my puny test cases, you are 79% mainstream

এবং সানস্টুডিও 11 64 বিট সহ

We like to think that:
..05 int has the size of pointers
   but 'sizeof(int)==sizeof(void*)' is false.
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..13 The smallest bits always come first
   but '(t=0x1234,0x34==*(char*)&t)' is false.
..14 i++ is strictly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..17 size_t is unsigned int
   but 'sizeof(size_t)==sizeof(unsigned int)' is false.
From what I can say with my puny test cases, you are 75% mainstream

2

আপনি fopen("filename", "r")যে কোনও ধরণের পাঠ্য ফাইল পড়তে পাঠ্য-মোড ( ) ব্যবহার করতে পারেন ।

যদিও এটি তাত্ত্বিকভাবে ঠিক কাজ করা উচিত , আপনি যদি নিজের কোডটিতেও ব্যবহার ftell()করেন এবং আপনার পাঠ্য ফাইলে উইন্ডোজ স্ট্যান্ডার্ড লাইব্রেরির কয়েকটি সংস্করণে ইউনিক্স-স্টাইলের লাইন-এন্ডিং থাকে, ftell()তবে প্রায়শই অবৈধ মান ফিরে আসবে। সমাধানটি হ'ল পরিবর্তে বাইনারি মোড ব্যবহার করা ( fopen("filename", "rb"))।


1

এআইএক্স ৫.৩-তে জিসিসি ৩.৩.২ (হ্যাঁ, আমাদের জিসিসি আপডেট করতে হবে)

We like to think that:
..04 a char is signed
   but 'CHAR_MIN==SCHAR_MIN' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..13 The smallest bits come always first
   but '(t=0x1234,0x34==*(char*)&t)' is false.
..14 i++ is structly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..16 malloc()=NULL means out of memory
   but '(malloc(0)!=NULL)' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 71% mainstream

1

একটি ধারণা যে কেউ সি ++ এ structকরতে পারে তা হ'ল একটি সি এর মধ্যে যা করতে পারে তা সীমাবদ্ধ। সত্যটি হ'ল, সি ++ এ একটি ডিফল্টরূপে সর্বজনীন থাকে তা বাদ দেওয়ার structমতো class

সি ++ স্ট্রাক্ট:

struct Foo
{
  int number1_;  //this is public by default


//this is valid in C++:    
private: 
  void Testing1();
  int number2_;

protected:
  void Testing2();
};

1

বিভিন্ন সিস্টেমে স্ট্যান্ডার্ড গণিত ফাংশনগুলি অভিন্ন ফলাফল দেয় না।


1

32-বিট x86 এ ভিজ্যুয়াল স্টুডিও এক্সপ্রেস 2010।

Z:\sandbox>cl testtoy.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

testtoy.c
testtoy.c(54) : warning C4293: '<<' : shift count negative or too big, undefined
 behavior
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:testtoy.exe
testtoy.obj

Z:\sandbox>testtoy.exe
We like to think that:
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..09a minus shifts backwards
   but '(t=-1,(15<<t)==7)' is false.
..14 i++ is structly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
..22 floating point is always IEEE
   but 'STDC_IEC_559_is_defined' is false.
From what I can say with my puny test cases, you are 78% mainstream

1

কোডেপড.অর্গ ( C++: g++ 4.1.2 flags: -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch) এর মাধ্যমে ।

নোট করুন যে কোডপ্যাডটি ছিল না stddef.h। সতর্কতাগুলি ত্রুটি হিসাবে ব্যবহার করে কোডপ্যাডের কারণে আমি পরীক্ষা 9 সরিয়েছি। আমি countভেরিয়েবলটির নামও রেখেছি কারণ এটি ইতিমধ্যে কোনও কারণে সংজ্ঞায়িত হয়েছিল।

We like to think that:
..08 overshifting is okay
   but '(1<<bits_per_int)==0' is false.
..14 i++ is structly left to right
   but '(i=0,a[i++]=i,a[0]==1)' is false.
..15 structs are packed
   but 'sizeof(char_int)==(sizeof(char)+sizeof(int))' is false.
..19-3 int<long
   but 'sizeof(int)<sizeof(long)' is false.
From what I can say with my puny test cases, you are 84% mainstream

1

অতিরিক্ত পরিমাণে ডান স্থানান্তর সম্পর্কে কীভাবে - এটি মানক দ্বারা অনুমোদিত, বা পরীক্ষার মূল্য?

স্ট্যান্ডার্ড সি নীচের প্রোগ্রামটির আচরণ নির্দিষ্ট করে:

শূন্য প্রিন্ট_স্ট্রিং (চর * স্ট্যান্ড)
{
  চর চি;
  যখন ((সিএইচ = * স্ট্যান্ড ++)! = 0)
    putch (CH); / * ধরে নিন এটি সংজ্ঞায়িত হয়েছে * /
}
প্রধান প্রধান (শূন্য)
{
  print_string ( "হ্যালো");
  প্রত্যাবর্তন 0;
}

অন্তত একটি কম্পাইলার আমি ব্যবহারের উপর যে কোড ব্যর্থ হবে যদি না print_string করার যুক্তি হল "গৃহস্থালির কাজ const *"। মানক কি এই জাতীয় বিধিনিষেধের অনুমতি দেয়?

কিছু সিস্টেম কাউকে বিনা স্বাক্ষরযুক্ত 'ইন্টের'র জন্য পয়েন্টার উত্পাদন করতে দেয় এবং অন্যরা তা করে না। পরীক্ষার যোগ্য হতে পারে।


C89 §3.3.7: "যদি ডান অপরেন্ডের মান negativeণাত্মক হয় বা প্রচারিত বাম অপারেন্ডের বিটগুলির প্রস্থের চেয়ে বড় বা সমান হয়, তবে আচরণটি অপরিবর্তিত।" (উভয় ক্ষেত্রে প্রযোজ্য <<এবং >>)। C99 এর language6.5.7-3 এ অভিন্ন ভাষা রয়েছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

putch(আপনি কেন স্ট্যান্ডার্ডটি ব্যবহার করেননি putchar?) বাদে আমি আপনার প্রোগ্রামে কোনও অপরিবর্তিত আচরণ দেখতে পাচ্ছি না। C89 §3.1.4 উল্লেখ করেছে যে "একটি চরিত্রের স্ট্রিং আক্ষরিক […] টাইপ করুন 'চরের অ্যারে'" (দ্রষ্টব্য: না const) এবং "যদি প্রোগ্রামটি একটি স্ট্রিংকে আক্ষরিক পরিবর্তনের চেষ্টা করে […], আচরণটি অপরিবর্তিত থাকে" । এটি কোন সংকলক এবং এটি কীভাবে এই প্রোগ্রামটি অনুবাদ করে?
গিলস 'অশুভ হওয়া বন্ধ করুন'

2
সি ++ তে অক্ষরের ধ্রুবকগুলি চর নয় [], তারা কনস্ট চর []। তবে ... সেখানে ব্যবহৃত আপনি একটি প্রসঙ্গ যেখানে একটি গৃহস্থালি * প্রত্যাশিত ছিল একটি টাইপ ত্রুটি নয় পেতে একটি স্ট্রিং ধ্রুবক ব্যবহার করার অনুমতি দিতে টাইপ সিস্টেমের মধ্যে একটি নির্দিষ্ট গর্ত যাবে। এটি এমন পরিস্থিতিতে পরিচালিত করে যেখানে মুদ্রণ_তন্ত্র ("foo") কাজ করবে তবে মুদ্রণ_স্তায় ("foo" +0) তা ব্যবহার করবে না। এটি গভীরভাবে বিভ্রান্তিকর ছিল, বিশেষত পরিবেশে যেখানে সি ফাইলগুলি ডিফল্টরূপে সি ++ সংকলক ব্যবহার করে সংকলিত হয়। গর্তটি নতুন সংকলকগুলিতে সরানো হয়েছে তবে চারপাশে এখনও প্রচুর পুরানো রয়েছে। আফাইক সি 99 এখনও স্ট্রিং ধ্রুবককে চর হিসাবে সংজ্ঞায়িত করেছে []
ডেভিড

1
মাইক্রোচিপ পিআইসি সিরিজের কন্ট্রোলারের হাইটেক সংকলকগুলিতে, স্টোরেজ যোগ্যতা ছাড়াই একটি পয়েন্টার কেবল র‌্যামের দিকে নির্দেশ করতে পারে। কোনও কনস্ট-কোয়ালিফাইড পয়েন্টারটি র‍্যাম বা রমকে নির্দেশ করতে পারে। নন-কনস্ট্যান্ট-কোয়ালিফাইড পয়েন্টারগুলিকে সরাসরি কোডে ডিফারেন্স করা হয়; কনস্ট-কোয়ালিফাইড পয়েন্টারগুলি লাইব্রেরি রুটিনের মাধ্যমে সীমাবদ্ধ হয়। পিআইসির নির্দিষ্ট ধরণের উপর নির্ভর করে নন-কনস্ট্যান্ট যোগ্য পয়েন্টারগুলি 1 বা 2 বাইট; কনস্ট-কোয়ালিফাইডগুলি হ'ল 2 বা 3। রম যেহেতু র‌্যামের চেয়ে অনেক বেশি, তাই রমে ধ্রুবক থাকা সাধারণত একটি ভাল জিনিস।
সুপারক্যাট

@ ডেভিড দেওয়া: আমার আগের মন্তব্যটিও নোট করুন। আমি এমন সংকলকগুলিকে পছন্দ করি যা হার্ডওয়্যার স্টোরেজ ক্লাস বোঝাতে "কনস্ট" ব্যতীত অন্য কোয়ালিফায়ার ব্যবহার করে; হাইটেক সংকলকটির স্টোরেজ শ্রেণীর বরাদ্দ দিয়ে কিছু বিরক্তিকর quirks রয়েছে (উদাহরণস্বরূপ ডেটা আইটেম যার "উপাদান আকার" বাইট, বা ডেটা আইটেমগুলি 256 বাইটের বেশি, একটি "বড়" বিভাগে যান Other অন্যান্য ডেটা আইটেমগুলিতে যায় " বিএসএস "বিভাগটি যে মডিউলটির জন্য তারা সংজ্ঞায়িত হয়েছে তার জন্য; মডিউলে থাকা সমস্ত" বিএসএস "আইটেমগুলি অবশ্যই 256 বাইটের মধ্যে মাপসই করা উচিত 25 256 বাইটের থেকে সামান্য সংক্ষিপ্ত অ্যারেগুলি সত্যিকারের উপদ্রব হতে পারে
সুপারক্যাট

0

এফওয়াইআই, তাদের সি দক্ষতা জাভাতে অনুবাদ করতে হবে, তাদের জন্য এখানে কয়েকটি গোছা রয়েছে।

EXPECT("03 a char is 8 bits",CHAR_BIT==8);
EXPECT("04 a char is signed",CHAR_MIN==SCHAR_MIN);

জাভাতে, চরটি 16-বিট এবং স্বাক্ষরিত। বাইটটি 8-বিট এবং স্বাক্ষরিত।

/* not true for Windows-64 */
EXPECT("05a long has at least the size of pointers",sizeof(long)>=sizeof(void*));

দীর্ঘসময় সর্বদা 64৪-বিট, রেফারেন্সগুলি 32-বিট বা -৪-বিট হতে পারে (যদি আপনার কাছে 32 জিবি-র বেশি অ্যাপ্লিকেশন থাকে) -৪-বিট জেভিএম সাধারণত 32-বিট রেফারেন্স ব্যবহার করে।

EXPECT("08 overshifting is okay",(1<<bits_per_int)==0);
EXPECT("09 overshifting is *always* okay",(1<<BITS_PER_INT)==0);

শিফটটি এমনভাবে মুখোশ দেওয়া হয়েছে যাতে আমি << 64 == i == আমি << -64, আমি << 63 == আমি << -1

EXPECT("13 The smallest bits always come first",(t=0x1234,0x34==*(char*)&t));

বাইটআর্ডার.নেটিভ অর্ডার () BIG_ENDIAN বা LITTLE_ENDIAN হতে পারে

EXPECT("14 i++ is strictly left to right",(i=0,a[i++]=i,a[0]==1));

i = i++ কখনও পরিবর্তন হয় না i

/* suggested by David Thornley */
EXPECT("17 size_t is unsigned int",sizeof(size_t)==sizeof(unsigned int));

জেভিএম 32-বিট বা 64-বিট নির্বিশেষে সংগ্রহ এবং অ্যারের আকার সর্বদা 32-বিট থাকে।

EXPECT("19-1 char<short",sizeof(char)<sizeof(short));
EXPECT("19-2 short<int",sizeof(short)<sizeof(int));
EXPECT("19-3 int<long",sizeof(int)<sizeof(long));

চরটি 16-বিট, সংক্ষিপ্তটি 16-বিট, ইন্ট 32-বিট এবং দীর্ঘ 64-বিট।

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