क्यों प्रोग्रामिंग भाषाएं, विशेष रूप से सी, घुंघराले ब्रेसिज़ का उपयोग करती हैं और वर्ग नहीं?


96

"सी-स्टाइल भाषा" की परिभाषा को व्यावहारिक रूप से "घुंघराले ब्रेसिज़ ( {}) " का उपयोग करने के लिए सरल बनाया जा सकता है । हम उस विशेष चरित्र का उपयोग क्यों करते हैं (और क्यों कुछ अधिक उचित नहीं है, जैसे [], जिसे कम से कम यूएस कीबोर्ड पर शिफ्ट कुंजी की आवश्यकता नहीं है)?

क्या प्रोग्रामर उत्पादकता का कोई वास्तविक लाभ है जो इन ब्रेसिज़ से आता है, या नए भाषा डिजाइनरों को विकल्पों की तलाश करनी चाहिए (यानी पायथन के पीछे के लोग)?

विकिपीडिया हमें बताता है कि C उक्त ब्रेसिज़ का उपयोग करता है, लेकिन क्यों नहीं। सी-आधारित प्रोग्रामिंग भाषाओं की सूची पर विकिपीडिया लेख में एक बयान बताता है कि यह वाक्यविन्यास तत्व कुछ विशेष है:

मोटे तौर पर, सी-फैमिली लैंग्वेज वे हैं जो सी-ब्लॉक ब्लॉक सिंटैक्स का उपयोग करते हैं (ब्लॉक शुरू करने और समाप्त करने के लिए घुंघराले ब्रेसिज़ सहित ) ...


35
इसका जवाब देने वाला एकमात्र व्यक्ति डेनिस रिची है और वह मर चुका है। एक उचित अनुमान यह है कि [] पहले से ही सरणियों के लिए लिया गया था।
डर्क होलसॉपल

2
@DirkHolsopple तो उसने कोई तर्क नहीं छोड़ा? Drat। इसके अलावा: मैं कुछ के बारे में दो downvotes मैं वास्तव में के बारे में उत्सुक हूँ? धन्यवाद दोस्तों ....
SomeKittens

1
कृपया इस प्रश्न के बारे में इस मेटा प्रश्न में चर्चा जारी रखें ।
थॉमस ओवेन्स

2
मैंने इस पोस्ट को अनलॉक किया है। कृपया मेटा के प्रश्न पर उपयुक्तता के बारे में प्रश्न और चर्चा के बारे में कोई टिप्पणी रखें ।
थॉमस ओवेन्स

5
यह शायद इस तथ्य के साथ भी कुछ करना है कि घुंघराले ब्रेसिज़ का उपयोग गणित में सेट संकेतन में किया जाता है, जिससे उन्हें एरे एलिमेंट एक्सेस के लिए उपयोग करने के लिए कुछ अजीब हो जाता है, न कि "सेट" जैसी चीज़ों की तुलना में, जैसे संरचना, सरणियाँ, आदि। यहां तक ​​कि पायथन जैसी आधुनिक भाषाएं सेट और शब्दकोशों की घोषणा करने के लिए घुंघराले ब्रेसिज़ का उपयोग करती हैं। फिर सवाल यह है कि सी ने गुंजाइश घोषित करने के लिए घुंघराले ब्रेसिज़ का उपयोग क्यों किया? शायद इसलिए कि डिज़ाइनर केवल ज्ञात विकल्पों को पसंद नहीं करते थे, जैसे कि BEGIN / END, और ओवरलोडिंग ऐरे एक्सेस नोटेशन ([]) को सेट नोटेशन की तुलना में कम सौंदर्यवादी ध्वनि माना जाता था।
चार्ल्स साल्विया

जवाबों:


102

C के दो प्रमुख प्रभाव भाषाओं के Algol परिवार (Algol 60 और Algol 68) और BCPL (जिसमें से C अपना नाम लेता है) थे।

BCPL पहली घुंघराले ब्रैकेट प्रोग्रामिंग भाषा थी, और घुंघराले कोष्ठक वाक्यविन्यास परिवर्तनों से बचे और प्रोग्राम सोर्स कोड स्टेटमेंट्स को निरूपित करने का एक सामान्य साधन बन गए। व्यवहार में, दिन के सीमित कीबोर्ड पर, स्रोत कार्यक्रमों ने अक्सर प्रतीकों {और} के स्थान पर अनुक्रम $ (और $) का उपयोग किया। BCPL की एकल-पंक्ति '//' टिप्पणियां, जो C में नहीं ली गईं, C ++ में फिर से दिखाई दीं, और बाद में C99 में।

से http://www.princeton.edu/~achaney/tmve/wiki100k/docs/BCPL.html

BCPL ने कई नवाचारों की शुरुआत की और उन्हें लागू किया जो बाद की भाषाओं के डिजाइन में काफी सामान्य तत्व बन गए। इस प्रकार, यह पहली घुंघराले ब्रैकेट प्रोग्रामिंग भाषा थी (एक का उपयोग {} के रूप में ब्लॉक सीमांकक के रूप में), और यह इनलाइन टिप्पणियों को चिह्नित करने के लिए // का उपयोग करने वाली पहली भाषा थी।

से http://progopedia.com/language/bcpl/

बीसीपीएल के भीतर, एक अक्सर घुंघराले ब्रेसिज़ देखता है, लेकिन हमेशा नहीं। यह उस समय कीबोर्ड की एक सीमा थी। वर्ण $(और अक्षर के $)समान {और समतुल्य थे }डिग्राफ और ट्रिग्राफ को सी में बनाए रखा गया था (हालांकि घुंघराले ब्रेस प्रतिस्थापन के लिए एक अलग सेट - ??<और ??>)।

घुंघराले ब्रेसिज़ का उपयोग बी में परिष्कृत किया गया था (जो पहले सी)।

से बी करने के लिए उपयोगकर्ताओं के संदर्भ केन थॉम्पसन द्वारा:

/* The following function will print a non-negative number, n, to
  the base b, where 2<=b<=10,  This routine uses the fact that
  in the ASCII character set, the digits 0 to 9 have sequential
  code values.  */

printn(n,b) {
        extern putchar;
        auto a;

        if(a=n/b) /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n%b + '0');
}

इस बात के संकेत हैं कि घुंघराले ब्रेसिज़ का उपयोग अल्गोल के लिए beginऔर उसके endभीतर शॉर्ट हैंड के रूप में किया गया था ।

मुझे याद है कि आपने उन्हें 256-वर्ण कार्ड कोड में भी शामिल किया था, जिसे आपने CACM में प्रकाशित किया था, क्योंकि मुझे यह दिलचस्प लगा कि आपने प्रस्तावित किया कि उनका उपयोग अल्गोल के 'आरंभ' और 'अंत' कीवर्ड के स्थान पर किया जा सकता है, जो वास्तव में है बाद में C भाषा में उनका उपयोग कैसे किया गया।

से http://www.bobbemer.com/BRACES.HTM


वर्ग कोष्ठक का उपयोग (प्रश्न में सुझाए गए प्रतिस्थापन के रूप में) आगे भी वापस जाता है। जैसा कि उल्लेख किया गया है, अल्गोल परिवार ने सी। अल्गोल 60 और 68 (सी 1972 और बीसीपीएल 1966 में लिखा गया था) के भीतर प्रभावित किया था, वर्ग ब्रैकेट को एक सरणी या मैट्रिक्स में एक सूचकांक नामित करने के लिए उपयोग किया गया था।

BEGIN
  FILE F(KIND=REMOTE);
  EBCDIC ARRAY E[0:11];
  REPLACE E BY "HELLO WORLD!";
  WRITE(F, *, E);
END.

जैसा कि प्रोग्रामर पहले से ही अल्गोल और बीसीपीएल में सरणियों के लिए वर्ग कोष्ठक से परिचित थे, और बीसीपीएल में ब्लॉकों के लिए घुंघराले ब्रेसिज़ थे, दूसरी भाषा बनाते समय इसे बदलने की बहुत कम आवश्यकता या इच्छा थी।


अपडेट किए गए प्रश्न में घुंघराले ब्रेस के उपयोग के लिए उत्पादकता का एक विवरण शामिल है और अजगर का उल्लेख है। कुछ अन्य संसाधन हैं जो इस अध्ययन को करते हैं, हालांकि उत्तर "इसके उपाख्यान के लिए उबलता है, और जो आप उपयोग करते हैं वह वही है जिसके साथ आप सबसे अधिक उत्पादक हैं।" विभिन्न भाषाओं के साथ प्रोग्रामिंग और परिचितता में व्यापक रूप से भिन्न कौशल के कारण, इनका हिसाब लगाना मुश्किल हो जाता है।

यह भी देखें: स्टैक ओवरफ्लो क्या सांख्यिकीय अध्ययन हैं जो इंगित करते हैं कि पायथन "अधिक उत्पादक" है?

अधिकांश लाभ आईडीई (या कमी) पर निर्भर होते हैं जो उपयोग किया जाता है। Vi आधारित संपादकों में, कर्सर को एक मैचिंग ओपन / क्लोज और दबाने %पर कर्सर को अन्य मिलान चरित्र में ले जाएगा। यह पुराने दिनों में सी आधारित भाषाओं के साथ बहुत ही कुशल है - अभी तक कम।

एक बेहतर तुलना बीच होगी {}और begin/ endजो दिन का विकल्प था (क्षैतिज स्थान कीमती था)। कई Wirth भाषाएँ एक शैली beginऔर end(Algol (ऊपर वर्णित), पास्कल (कई परिचित हैं), और मोडुला परिवार) पर आधारित थीं ।

मुझे इस विशिष्ट भाषा सुविधा को अलग करने में कोई कठिनाई है - सबसे अच्छा मैं यह दिखा सकता हूं कि घुंघराले ब्रेस भाषाएं शुरुआती भाषाओं की तुलना में बहुत अधिक लोकप्रिय हैं और यह एक सामान्य निर्माण है। जैसा कि ऊपर बॉब बेमर लिंक में उल्लेख किया गया है, घुंघराले ब्रेस का उपयोग शॉर्टहैंड के रूप में प्रोग्राम करना आसान बनाने के लिए किया गया था।

से क्यों पास्कल नहीं है मेरा पसंदीदा प्रोग्रामिंग भाषा

C और रैटफोर प्रोग्रामर {और} की तुलना में 'start ’और bul end’ bulky पाते हैं।

जो कि सभी के बारे में कहा जा सकता है - इसकी परिचितता और प्राथमिकता।


14
अब यहां हर कोई काम करने के बजाय
BCPL

ट्रिग्राफ (1989 आईएसओ सी मानक में पेश किए गए हैं) {और }हैं ??<और हैं ??>। डिग्राफ (1995 के संशोधन द्वारा पेश) हैं <%और %>। बहुत शुरुआती अनुवाद चरण में सभी संदर्भों में ट्रिग्राफ का विस्तार किया जाता है। डिग्राफ टोकन हैं, और स्ट्रिंग शाब्दिक, चरित्र स्थिरांक या टिप्पणियों में विस्तारित नहीं हैं।
कीथ थॉम्पसन

सी में इसके लिए 1989 से पहले कुछ मौजूद था (मुझे उस पर तारीख पाने के लिए अपना पहला संस्करण बुक खोदना होगा)। सभी EBCDIC कोड पृष्ठों में एक घुंघराले ब्रेस (या चौकोर कोष्ठक) नहीं थे, और इसके लिए शुरुआती सी कंपाइलरों में प्रावधान थे।

@NevilleDNZ BCPL ने 1966 में घुंघराले ब्रेसिज़ का उपयोग किया। जहाँ Algol68 को इसकी धारणा मिली, वह कुछ खोज करने के लिए होगा - लेकिन BCPL को Algo68 से नहीं मिला। टर्नरी ऑपरेटर कुछ ऐसी चीज़ है जिसकी मुझे दिलचस्पी है और इसे सीपीएल (1963) (बीसीपीएल के पूर्ववर्ती) ने वापस ट्रैक किया है जिसने लिस्प (1958) से धारणा उधार ली थी।

1968: Algol68 परमिट दौर के एक आशुलिपि के रूप में कोष्ठक (~) शुरू ~ अंत बोल्ड प्रतीक ब्लॉक। इन्हें संक्षिप्त प्रतीक कहा जाता है , cf wp: Algol68 बोल्ड प्रतीक , यह कोड के ब्लॉक को अभिव्यक्ति की तरह ही व्यवहार करने की अनुमति देता है । A68 भी संक्षिप्त सी की तरह shorthands ? त्रिगुट ऑपरेटर: जैसे x:=(c|s1|s2)बजाय सी x=c?s1|s2। इसी तरह से if & case स्टेटमेंट पर लागू होता है । ¢ Btw: A68 जहां खोल मिला यह है से है esac और फाई ¢
NevilleDNZ

24

वर्ग ब्रेसिज़ []टाइप करना आसान है, कभी आईबीएम 2741 टर्मिनल के बाद से "मल्टीिक्स पर व्यापक रूप से उपयोग किया जाने वाला" ओएस, जिसमें बदले में डेनिस रिची, सी भाषा रचनाकारों में से एक देव टीम सदस्य थे

http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/APL-keybd2.svg/600px-APL-keybd2.svg.png

आईबीएम 2741 लेआउट में घुंघराले ब्रेसिज़ की अनुपस्थिति पर ध्यान दें !

सी में, वर्ग ब्रेसिज़ को "लिया" जाता है क्योंकि इनका उपयोग सरणियों और बिंदुओं के लिए किया जाता है । यदि भाषा डिजाइनरों ने सरणियों और बिंदुओं की अपेक्षा की, जो कोड ब्लॉकों की तुलना में अधिक महत्वपूर्ण / बार-बार उपयोग किए जाते हैं (जो उनकी तरफ एक उचित धारणा की तरह लगता है, नीचे कोडिंग शैली के ऐतिहासिक संदर्भ में अधिक है), तो इसका मतलब होगा कि घुंघराले ब्रेसिज़ "कम महत्वपूर्ण" होंगे " वाक्य - विन्यास।

लेख का विकास द रिची द्वारा सी लैंग्वेज में एरे का महत्व बहुत स्पष्ट है । यहां तक ​​कि "सी कार्यक्रमों में संकेत की व्यापकता" के बारे में भी स्पष्ट रूप से कहा गया है

... नई भाषा ने सरणियों के शब्दार्थ की एक सुसंगत और व्यावहारिक (यदि असामान्य है) व्याख्या को बनाए रखा है ... दो विचार इसके वर्ग की भाषाओं के बीच सी की सबसे अधिक विशेषता हैं : सरणियों और बिंदुओं के बीच का संबंध ... अन्य विशिष्ट विशेषता सी, इसकी सरणियों का उपचार ... वास्तविक गुण हैं । हालांकि संकेत और सरणियों के बीच संबंध असामान्य है, यह सीखा जा सकता है। इसके अलावा, भाषा महत्वपूर्ण अवधारणाओं का वर्णन करने के लिए काफी शक्ति दिखाती है , उदाहरण के लिए, वैक्टर जिनकी लंबाई समय के साथ बदलती है, केवल कुछ बुनियादी नियमों और सम्मेलनों के साथ ...


ऐतिहासिक संदर्भ और उस समय की कोडिंग शैली को समझने के लिए जब सी भाषा बनाई गई थी, तो किसी को इस बात का ध्यान रखना होगा कि "सी की उत्पत्ति यूनिक्स के विकास के साथ निकटता से जुड़ी हुई है" और, विशेष रूप से, जो ओएस को पीडीपी में पोर्ट कर रहा है- 11 "सी के प्रारंभिक संस्करण के विकास का नेतृत्व किया" ( उद्धरण स्रोत )। विकिपीडिया के अनुसार , "1972 में, यू प्रोग्रामिंग को सी प्रोग्रामिंग भाषा में फिर से लिखा गया"

यूनिक्स के विभिन्न पुराने संस्करणों का स्रोत कोड यूनिक्स ट्री साइट पर ऑनलाइन उपलब्ध है । वहाँ प्रस्तुत विभिन्न संस्करणों में, सबसे अधिक प्रासंगिक लगता है दूसरा संस्करण यूनिक्स दिनांक 1972-06:

यूनिक्स के दूसरे संस्करण को केन थॉम्पसन, डेनिस रिची और अन्य द्वारा बेल लैब्स में पीडीपी -11 के लिए विकसित किया गया था। इसने पहले संस्करण को और अधिक सिस्टम कॉल और अधिक कमांड के साथ बढ़ाया। इस संस्करण में सी भाषा की शुरुआत भी देखी गई, जिसका इस्तेमाल कुछ आदेशों को लिखने के लिए किया गया था ...

आप उस समय की विशिष्ट कोडिंग शैली का अंदाजा लगाने के लिए दूसरे संस्करण यूनिक्स (V2) पृष्ठ से C स्रोत कोड को ब्राउज़ और अध्ययन कर सकते हैं ।

एक प्रमुख उदाहरण जो इस विचार का समर्थन करता है कि प्रोग्रामर के लिए यह महत्वपूर्ण था कि वर्ग ब्रैकेट को आसानी से टाइप करने में सक्षम होने के लिए V2 / c / ncc.c स्रोत कोड पाया जा सकता है :

/* C command */

main(argc, argv)
char argv[][]; {
    extern callsys, printf, unlink, link, nodup;
    extern getsuf, setsuf, copy;
    extern tsp;
    extern tmp0, tmp1, tmp2, tmp3;
    char tmp0[], tmp1[], tmp2[], tmp3[];
    char glotch[100][], clist[50][], llist[50][], ts[500];
    char tsp[], av[50][], t[];
    auto nc, nl, cflag, i, j, c;

    tmp0 = tmp1 = tmp2 = tmp3 = "//";
    tsp = ts;
    i = nc = nl = cflag = 0;
    while(++i < argc) {
        if(*argv[i] == '-' & argv[i][1]=='c')
            cflag++;
        else {
            t = copy(argv[i]);
            if((c=getsuf(t))=='c') {
                clist[nc++] = t;
                llist[nl++] = setsuf(copy(t));
            } else {
            if (nodup(llist, t))
                llist[nl++] = t;
            }
        }
    }
    if(nc==0)
        goto nocom;
    tmp0 = copy("/tmp/ctm0a");
    while((c=open(tmp0, 0))>=0) {
        close(c);
        tmp0[9]++;
    }
    while((creat(tmp0, 012))<0)
        tmp0[9]++;
    intr(delfil);
    (tmp1 = copy(tmp0))[8] = '1';
    (tmp2 = copy(tmp0))[8] = '2';
    (tmp3 = copy(tmp0))[8] = '3';
    i = 0;
    while(i<nc) {
        if (nc>1)
            printf("%s:\n", clist[i]);
        av[0] = "c0";
        av[1] = clist[i];
        av[2] = tmp1;
        av[3] = tmp2;
        av[4] = 0;
        if (callsys("/usr/lib/c0", av)) {
            cflag++;
            goto loop;
        }
        av[0] = "c1";
        av[1] = tmp1;
        av[2] = tmp2;
        av[3] = tmp3;
        av[4] = 0;
        if(callsys("/usr/lib/c1", av)) {
            cflag++;
            goto loop;
        }
        av[0] = "as";
        av[1] = "-";
        av[2] = tmp3;
        av[3] = 0;
        callsys("/bin/as", av);
        t = setsuf(clist[i]);
        unlink(t);
        if(link("a.out", t) | unlink("a.out")) {
            printf("move failed: %s\n", t);
            cflag++;
        }
loop:;
        i++;
    }
nocom:
    if (cflag==0 & nl!=0) {
        i = 0;
        av[0] = "ld";
        av[1] = "/usr/lib/crt0.o";
        j = 2;
        while(i<nl)
            av[j++] = llist[i++];
        av[j++] = "-lc";
        av[j++] = "-l";
        av[j++] = 0;
        callsys("/bin/ld", av);
    }
delfil:
    dexit();
}
dexit()
{
    extern tmp0, tmp1, tmp2, tmp3;

    unlink(tmp1);
    unlink(tmp2);
    unlink(tmp3);
    unlink(tmp0);
    exit();
}

getsuf(s)
char s[];
{
    extern exit, printf;
    auto c;
    char t, os[];

    c = 0;
    os = s;
    while(t = *s++)
        if (t=='/')
            c = 0;
        else
            c++;
    s =- 3;
    if (c<=8 & c>2 & *s++=='.' & *s=='c')
        return('c');
    return(0);
}

setsuf(s)
char s[];
{
    char os[];

    os = s;
    while(*s++);
    s[-2] = 'o';
    return(os);
}

callsys(f, v)
char f[], v[][]; {

    extern fork, execv, wait, printf;
    auto t, status;

    if ((t=fork())==0) {
        execv(f, v);
        printf("Can't find %s\n", f);
        exit(1);
    } else
        if (t == -1) {
            printf("Try again\n");
            return(1);
        }
    while(t!=wait(&status));
    if ((t=(status&0377)) != 0) {
        if (t!=9)       /* interrupt */
            printf("Fatal error in %s\n", f);
        dexit();
    }
    return((status>>8) & 0377);
}

copy(s)
char s[]; {
    extern tsp;
    char tsp[], otsp[];

    otsp = tsp;
    while(*tsp++ = *s++);
    return(otsp);
}

nodup(l, s)
char l[][], s[]; {

    char t[], os[], c;

    os = s;
    while(t = *l++) {
        s = os;
        while(c = *s++)
            if (c != *t++) goto ll;
        if (*t++ == '\0') return (0);
ll:;
    }
    return(1);
}

tsp;
tmp0;
tmp1;
tmp2;
tmp3;

यह ध्यान रखना दिलचस्प है कि लक्षित व्यावहारिक अनुप्रयोगों में उनके उपयोग के आधार पर भाषा के वाक्यविन्यास तत्वों को निरूपित करने के लिए पात्रों को चुनने की व्यावहारिक प्रेरणा जिप्पी के कानून से कैसे मिलती है जैसा कि इस भयानक उत्तर में बताया गया है ...

आवृत्ति और लंबाई के बीच मनाया गया संबंध जिपफ लॉ कहलाता है

... केवल इस अंतर के साथ कि उपरोक्त कथन में लंबाई टाइपिंग की गति के रूप में / सामान्यीकृत है।


5
भाषा डिजाइनरों द्वारा इस "स्पष्ट" अपेक्षा के समर्थन में कुछ भी? यह C में बहुत प्रोग्रामिंग नहीं लेता है यह देखने के लिए कि घुंघराले ब्रेस सरणी घोषणाओं की तुलना में बहुत अधिक सामान्य हैं। पुराने दिनों से यह वास्तव में बहुत नहीं बदला है - K & R पर एक नज़र है।

1
मैं किसी तरह इस स्पष्टीकरण पर संदेह करता हूं। हम नहीं जानते कि क्या उम्मीद की जा सकती है और वे इसे आसानी से दूसरे तरीके से चुन सकते हैं क्योंकि वे लोगों को सरणी संकेतन के बारे में भी फैसला करने के लिए थे। हम यह भी नहीं जानते हैं कि क्या वे घुंघराले ब्रेसिज़ को "कम महत्वपूर्ण" विकल्प मानते हैं, शायद वे घुंघराले ब्रेसिज़ को अधिक पसंद करते हैं।
थोरस्टेन मुलर

3
@gnat: स्क्वायर ब्रेसिज़ आधुनिक कीबोर्ड पर टाइप करना आसान है, क्या यह उन कीबोर्ड पर लागू होता है जो यूनिक्स और सी पहली बार लागू किए जाने के आसपास थे? मेरे पास यह संदेह करने का कोई कारण नहीं है कि वे एक ही कीबोर्ड का उपयोग कर रहे थे, या वे यह मान लेंगे कि अन्य कीबोर्ड उनके कीबोर्ड की तरह होंगे, या उन्होंने सोचा होगा कि टाइपिंग की गति एक चरित्र द्वारा अनुकूलन के लायक होगी।
माइकल शॉ

1
इसके अलावा, जिपफ का नियम एक सामान्यीकरण है जो प्राकृतिक भाषाओं में हो रहा है। सी कृत्रिम रूप से बनाया गया था, इसलिए यह सोचने का कोई कारण नहीं है कि यह यहां लागू होगा जब तक कि सी के डिजाइनरों ने जानबूझकर इसे लागू करने का फैसला नहीं किया। यदि यह लागू होता है, तो यह मानने का कोई कारण नहीं है कि यह किसी एकल वर्ण के रूप में पहले से ही कुछ सरल कर देगा।
माइकल शॉ

1
@gnat FWIW, grep -Foमुझे *.cCPython सोर्स कोड की फाइलें बताता है (Rev। 4b42d7f288c5 क्योंकि मेरे पास जो हाथ है), जिसमें libffi शामिल है, जिसमें 39511 {(39508 {, dunno क्यों दो ब्रेसेस बंद नहीं हैं) शामिल हैं, लेकिन केवल 13718 [(1370213) [)। यह स्ट्रिंग में होने वाली घटनाओं की गणना करता है और संदर्भों में इस प्रश्न से असंबंधित है, इसलिए यह वास्तव में सटीक नहीं है, भले ही हम अनदेखा करें कि कोड आधार प्रतिनिधि नहीं हो सकता है (ध्यान दें कि यह पूर्वाग्रह किसी भी दिशा में जा सकता है)। फिर भी, 2.8 का एक कारक?

1

सी (और बाद में C ++ और C #) को अपने पूर्ववर्ती बी से इसकी ब्रेसिंग शैली विरासत में मिली , जिसे केन थॉम्पसन (डेनिस रिची के योगदान से) द्वारा 1969 में लिखा गया था।

यह उदाहरण केन थॉम्पसन द्वारा विकिपीडिया के माध्यम से उपयोगकर्ताओं के संदर्भ बी से है :

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10,  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n,b) {
        extern putchar;
        auto a;

        if(a=n/b) /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n%b + '0');
}

B खुद फिर से BCPL पर आधारित था , जो मार्टिन रिचर्ड्स द्वारा 1966 में मल्टिक्स ऑपरेटिंग सिस्टम के लिए लिखी गई एक भाषा थी। B का ब्रेसिंग सिस्टम केवल राउंड ब्रेसिज़ का उपयोग करता है, अतिरिक्त वर्णों द्वारा संशोधित (प्रिंट रिचर्ड्स उदाहरण के लिए मार्टिन रिचर्ड्स द्वारा, विकिपीडिया ) के माध्यम से :

GET "LIBHDR"

LET START() = VALOF $(
        FOR I = 1 TO 5 DO
                WRITEF("%N! = %I4*N", I, FACT(I))
        RESULTIS 0
)$

AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)

B और बाद की भाषाओं में उपयोग किए जाने वाले घुंघराले ब्रेसिज़ "{...}" BCPL में मूल कंपाउंड ब्रेस स्टाइल "$ (...) $" पर बनाया गया एक सुधार केन थॉम्पसन है।


1
ऐसा लगता है कि बॉब बेमर ( en.wikipedia.org/wiki/Bob_Bemer ) इसके लिए जिम्मेदार है - "... आपने प्रस्तावित किया कि उनका उपयोग अल्गोल 'शुरू' और 'अंत' कीवर्ड के स्थान पर किया जा सकता है, जो वास्तव में है बाद में सी भाषा में उनका उपयोग कैसे किया गया। ” ( bobbemer.com/BRACES.HTM से )
SChepurin

1
$( ... $)प्रारूप के बराबर है { ... }BCPL में lexer में, बस के रूप में ??< ... ??>बराबर है करने के लिए { ... }सी में दो शैलियों के बीच सुधार कुंजीपटल हार्डवेयर में है - नहीं भाषा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.