यह समाप्त क्यों नहीं हो रहा है? [बन्द है]


95

आपका कार्य: एक प्रोग्राम लिखना है जिसे स्पष्ट रूप से समाप्त करना चाहिए, लेकिन यह कभी (कंप्यूटर क्रैश की सीमा तक) नहीं करता है। इसे ऐसे बनाएं जैसे कि यह एक सरल कार्य करना चाहिए: संख्याओं को जोड़ना, कुछ को प्रिंट करना, ... लेकिन यह सिर्फ एक अनंत लूप में फंस जाता है।

अपने कार्यक्रम को बहुत स्पष्ट और सरल बनाने की कोशिश करें, जबकि यह वास्तव में एक अप्रत्याशित लूप में फंस जाएगा। मतदाता: उत्तरों को कैसे "कम करके" पर जज करें!

यह एक लोकप्रियता प्रतियोगिता है: रचनात्मक बनें!


6
क्या कोई यह बता सकता है कि प्रश्न को कम व्यापक बनाने के लिए मैं क्या कर सकता हूं? मैं यहाँ नया हूँ। धन्यवाद!
13

6
यह बस टाइपो और बिगिनर की गलतियों की एक बड़ी सूची बनने जा रहा है जो लूप का कारण बनता है।
बिल वुडगेर

दिलचस्प सवाल है, लेकिन मैंने अभी तक कोई भी रचनात्मक जवाब नहीं देखा है। मैं उन लोगों को वोट देने का वादा करता हूं जो लूप या स्पष्ट पुनरावृत्ति का उपयोग नहीं करते हैं!
ApproachingDarknessFish

14
मुझे नहीं पता कि यह मायने रखता है, लेकिन मेरा Microsoft कार्यालय इस समय बिल्कुल ऐसा ही व्यवहार कर रहा है।
लेवल रिवर सेंट

1
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि अंडरहैंड चुनौतियां अब यहां विषय पर नहीं हैं। meta.codegolf.stackexchange.com/a/8326/20469
बिल्ली

जवाबों:


185

जावास्क्रिप्ट

var x=prompt('Enter a value under 100');
while (x != 100) {
  x=x+1;
}
console.log('End!');

प्रॉम्प्ट () एक स्ट्रिंग लौटाता है और लूप चरित्र '1' को जोड़ता है, यह कभी भी 100 के बराबर नहीं होगा।


13
आप मुझे उस एक के साथ मिल गए ... (वास्तव में) उच्च-वोट किए गए उदाहरण सभी वाक्यविन्यास का दुरुपयोग कर रहे हैं ... लेकिन यह अच्छा है!
बोवेबी


4
@Vlakarados: पाइथन निहित प्रकार के रूपांतरण को जावास्क्रिप्ट नहीं करेगा। पायथन पर, raw_inputपायथन 3 का उपयोग करने वाला समकक्ष कोड inputa उठाता है TypeError
user2357112

2
इस तथ्य की जांच नहीं है कि मूल्य वास्तव में 100 से कम है, इसलिए जब आप "100" दर्ज करते हैं तो यह सामान्य रूप से बंद हो जाता है: '- (
C.Champagne

1
@Sankalp, +यहां संचालक स्ट्रिंग समवर्ती है, इसके अतिरिक्त नहीं।
माइकल एम।

87

सी

बस एक मूल उदाहरण कार्यक्रम जो सी में तीन अलग-अलग प्रकार के लूप को दिखाता है।

int main() {

    int x = 0;

    // Multi-statement while loops are of the form "while (condition) do { ... }" and
    // are used to execute multiple statements per loop; this is the most common form
    while (x < 10) do {
        x++;
    }

    // x is now 10

    // Null-statement while loops are of the form "while (condition) ;" and are used
    // when the expression's side effect (here, decrementing x) is all that is needed
    while (x-- > 0)
        ; // null statement

    // x is now -1

    // Single-statement while loops are of the form "while (condition) statement;"
    // and are used as a shorthand form when only a single statement is needed
    while (x > -10)
        x--;

    // x is now -10

    return 0;
}

जबकि लूप्स में घुंघराले ब्रेस खोलने से पहले "डू" नहीं होता है। यह वास्तव में (x <10) लूप के अंदर एक डू-टाइम लूप बनाता है जिसे लूप करते समय "null स्टेटमेंट" द्वारा समाप्त किया जाता है। चूँकि x लूप के अंदर बढ़ जाता है और फिर do-करते हुए लूप की स्थिति में कमी हो जाती है, इसलिए आंतरिक लूप कभी समाप्त नहीं होता है, और इसलिए बाहरी लूप नहीं होता है। अंत में "सिंगल-स्टेटमेंट" लूप कभी नहीं पहुंचता है।

यदि आप अभी भी भ्रमित हैं, तो यहां देखें (बाह्य रूप से होस्ट किए गए क्योंकि codegolf.SE को स्पॉइलर में कोड ब्लॉक पसंद नहीं है)।


8
Haha, मैं समाधान बिगाड़ने को देखने से पहले यह पता लगा लिया। : पी
जो जेड

54
आपने "ऑपरेटर को जाता है" का उपयोग करने का इतना उत्कृष्ट अवसर क्यों दिया? (x --> 0)
corsiKa

2
ओह वाह। यह आश्चर्यजनक रूप से बुराई है। मुझे चार के माध्यम से इसे खोजने के लिए पढ़ता है।
पैट्रिक एम

1
@JoeZ। रास्ता बहुत आसान है। सबसे उत्कीर्ण समाधान बेहतर था। जो मुझे नहीं मिला।
अनाम पी

3
@ हयात गाय, बैश के लिए है; करो और जबकि; वाक्यविन्यास करो ताकि मैं देख पाऊँ कि लोग इससे दूर हो रहे हैं, भले ही वे गैर-सी / सी ++ भाषाओं से परिचित हों। tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html
nemec

85

जावास्क्रिप्ट

var a = true;
(function() {
  while(!a){}
  alert("infinite");
  var a = true;
})();

परिवर्तनीय उत्थापन: जावास्क्रिप्ट वास्तव में मेरी दूसरी परिभाषा को पकड़ लेगा var a = true;, इसे फ़ंक्शन के शीर्ष पर घोषित करेगा var a;, और मेरे असाइनमेंट को संशोधित करते हुए a = true;अर्थ में aअपरिभाषित होने के समय अपरिभाषित हो जाएगा।


3
क्या आप इस बात की बेहतर व्याख्या जोड़ सकते हैं कि यह कभी समाप्त क्यों नहीं होता? कृपया "चर उत्थापन" के बारे में गहराई से जाएं :)
नंबर

1
@ नंबर 9 मुझे उम्मीद है कि इससे मदद मिलती है, गूगल के पास इससे बेहतर उदाहरण हैं;)
न्यूब्रिक्ट

25
पवित्र गंदगी यह अर्धविराम सम्मिलन से भी बदतर है। +1!
tomsmeding

2
केवल इस कार्यक्रम के साथ मुझे जो परेशानी होती है, वह यह है कि ऐसा नहीं लगता है कि यह एक सरल कार्य करता है ... ऐसा लगता है कि इसे अनिवार्य रूप से कुछ भी नहीं करना चाहिए। शायद alertलूप के बाद जोड़ें ।
पीटर टी

2
आप बदलना चाहिए a = 1करने के लिए a = true। कोड में अभी भी उस तरह का अनंत लूप होगा, लेकिन यह स्पष्ट हो जाएगा कि इसका कारण जावास्क्रिप्ट में किलों से बूलियन तक रूपांतरण में कुछ क्वर्क नहीं है।
रोरी ओ'केन

49

सी#

class Program
{
    // Expected output:
    // 20l
    // 402
    // 804
    // l608
    // 32l6
    // game over man

    static void Main()
    {
        var x = 20l;
        while (x != 6432)
        {
            Console.WriteLine(x);
            x *= 2;
        }
        Console.WriteLine("game over man");
    }
}

फ़ंक्शन की पहली पंक्ति में संख्या शाब्दिक एक '201' नहीं है, लेकिन एक '20' के साथ एक लोअरकेस 'एल' ( लंबे डेटाटाइप) प्रत्यय है। 6432 मार के बिना संख्या बहुत तेजी से बह निकलेगी, लेकिन कार्यक्रम तब तक चलता रहेगा जब तक कि बिल्ड विकल्पों में ओवरफ्लो की जाँच चालू नहीं हो जाती।
समझदारी से, दृश्य स्टूडियो 2013 (और शायद अन्य संस्करण भी) आपको इस कोड के लिए एक चेतावनी देता है, यह अनुशंसा करता है कि आप 'एल' के बजाय 'एल' का उपयोग करते हैं।


12
ओह, यह lएक की तरह लग रहा है 1! मैं मूर्ख हूँ। : \
जो जेड

6
सुधार के लिए सुझाव: 1s को ls के साथ अपेक्षित आउटपुट खंड में बदलें (यह अजीब चरित्र को स्पॉट करना आसान है जब आपके पास असली 1s से तुलना करने के लिए है)
एलन गाउन

3
हाँ, यह काफी पर्यावरण-विशिष्ट प्रतीत होता है। @ माइकल का फ़ॉन्ट मेरे होम कंप्यूटर ( imgur.com/PKIuJpr - क्रोम, विंडोज 8) पर फ़ॉन्ट के लिए बहुत अलग दिखता है , और यह ट्रिक मेरे होम कंप्यूटर की तुलना में मेरे काम के कंप्यूटर पर बेहतर काम करती है, भले ही वे काफी समान हो ऐनक। मेरे फ़ोन का ब्राउज़र निश्चित-निर्धारित फ़ॉन्ट में कोड नहीं दिखाता है, और इस पर चाल बिल्कुल काम नहीं करती है।
BenM

1
FTR, यहाँ यह मेरे काम कंप्यूटर ( imgur.com/Opfs3BH - फ़ायरफ़ॉक्स, विंडोज 7) पर कैसा दिखता है । मुझे लगता है कि कोई भी काफी आश्चर्यजनक लोगों को बेवकूफ बना सकता है।
BenM

15
क्यों हम लोगों की तरह आरोपों का आरोप लगाते हैं?
अनाम पी

39

सी

सटीकता के बारे में कैसे?

int main(void)
{
    double x = 0;
    while(x != 10) x += 0.1;
    return 0;
}

कल्पना कीजिए कि आपको कंप्यूटर मेमोरी में पूर्णांक संख्याओं की संख्या <0; 3> स्टोर करनी होगी। इस रेंज में केवल 4 पूर्णांक संख्याएं (0,1,2,3) हैं। यह मेमोरी में स्टोर करने के लिए 2 बिट्स का उपयोग करने के लिए पर्याप्त है। अब कल्पना करें कि आपको फ्लोटिंग पॉइंट नंबरों की एक श्रृंखला को स्टोर करना है <0; 3>। समस्या यह है कि इस रेंज में अनंत संख्या में फ्लोटिंग पॉइंट नंबर हैं। अनंत संख्याओं को कैसे स्टोर करें? यह असंभव है। हम केवल परिमित संख्याओं को संग्रहीत कर सकते हैं। यही कारण है कि कुछ संख्याएं जैसे 0.1 वास्तव में अलग हैं। 0.1 के मामले में यह 0.100000000000000006 है। जहाँ तक आप फ्लोटिंग पॉइंट नंबरों का उपयोग करने की स्थिति में == या! = का उपयोग नहीं करने की अत्यधिक अनुशंसा की जाती है।


1
यह कैसे काम करता है?
मम्द

5
राउंडिंग एरर। 0.1 वास्तव में 0.100000000000000006 है क्योंकि बाइनरी में 0.1 दशमलव में 1/3 की तरह है - यह बाइनरी विस्तार अनंत और आवधिक है।
ओरियन

3
वास्तव में एक गोल त्रुटि नहीं है। फ्लोटिंग पॉइंट वैल्यू किसी संख्या का अनुमानित प्रतिनिधित्व है। अनुमानित मूल्यों के बीच सटीक तुलना करने से काम नहीं चलने वाला है।
एकेहोलैंड

4
यही कारण है कि आपको (लगभग) समानता के लिए फ्लोट / डबल्स की तुलना कभी नहीं करनी चाहिए।
इमानुएल लैंडहोम

1
मैं यह देखने के लिए इंतजार कर रहा था। अच्छा लगा।
डेविड कॉनरेड

33

HTML / जावास्क्रिप्ट

कल्पना कीजिए कि आपके पेज में एक इनपुट बॉक्स है:

<input onfocus="if (this.value === '') alert('Input is empty!');">

: और अब आप इसे में कुछ टाइप करने के लिए ... क्रोम में प्रयास करें चाहते http://jsfiddle.net/jZp4X/

alertफंक्शन के साथ बुलाया गया मानक ब्राउज़र डायलॉग मोडल है, इसलिए जब यह प्रदर्शित होता है तो यह टेक्स्ट बॉक्स से फोकस को बाहर निकाल देता है, लेकिन जब इसे खारिज कर दिया जाता है तो टेक्स्ट बॉक्स फोकस को वापस प्राप्त करता है।


5
फ़ायरफ़ॉक्स में, इनपुट में अलर्ट के करीब ऑटोफोकस नहीं है, और दूसरी बार से यह मुझे अधिक अलर्ट नहीं दिखाने की पेशकश करता है और फिर मैं टेक्स्टबॉक्स में सामान्य रूप से लिख सकता हूं
ईनाको

6
अच्छा है। कोई छोरों या पुनरावृत्ति के लिए +1।
ApproachingDarknessFish

5
फ़ायरफ़ॉक्स या क्रोम में कोई लूप नहीं। FF एक बार डायलॉग क्लिक करने पर अलर्ट दिखाता है, आप इसे खारिज कर देते हैं और यही इसका अंत है। दोहराने के लिए इसे फिर से क्लिक कर सकते हैं। Chrome ऐसा ही करता है, लेकिन बॉक्स को फ़ोकस करता है, और आप इसमें टाइप भी कर सकते हैं। क्षमा करें, शायद पुराने संस्करणों पर यह एक समस्या थी, लेकिन अब और नहीं।
रोमनस्ट

6
IE11 मेरे लिए क्रोम के समान ही काम करता है। मुझे लगता है कि आपने अनजाने में मैक पर हर आधुनिक ब्राउज़र पर एक तरह से काम करने और विंडोज पर हर आधुनिक ब्राउज़र पर एक अलग तरीके से काम करने का एक उदाहरण पाया है!
रोमनस्ट

1
MSIE11 पर सामान्य रूप से (कोई लूप) काम नहीं करता है
kinokijuf

32

सी ++

#include <iostream>
#include <cstddef>

int main() {
    size_t sum = 0;
    for (size_t i = 10; i >= 0; --i) {
         sum += i;
    }
    std::cout << sum << std::endl;
    return 0;
}

हालत i >=0हमेशा सच है क्योंकि size_t अहस्ताक्षरित है।


2
एक अच्छा, लेकिन संकलक आम तौर पर इसके लिए एक चेतावनी का उत्पादन करते हैं;)
Synxis

2
@ सिनक्सिस हाँ संकलक करते हैं। लेकिन केवल अगर आप संकलक चेतावनी को चालू करते हैं। g++उनके बिना आपको इस बारे में चेतावनी नहीं दी जाएगी।
FDinoff

5
आपको हमेशा -Wall --pedanticवैसे भी उपयोग करना चाहिए ।
मार्टिन यूडिंग

3
@queueoverflow चेतावनी केवल उन झंडे के साथ नहीं दिखाई देती है। आप की जरूरत है -Wsign-compareजो के साथ चालू किया जा सकता है -Wextra
एफडिनॉफ

7
एक पानी का छींटा पर। # सेप्टिक
डेविड कॉनरेड

29

दे घुमा के

(कोई लूप या रिकर्सन के लिए अनुरोध नहीं था)

#!/bin/bash

# Demo arrays

foo=("Can I have an array?")

echo $foo

echo ${foo[0]}

foo[2] = `yes`

echo $foo

echo ${foo[2]}

[५] [५] को स्ट्रिंग of यस ’को असाइन करने के बजाय, यह सिस्टम कमांड को कॉल करता है yes, जो" हाँ \ n "की कभी न खत्म होने वाली राशि के साथ फू [2] भरता है।


अंततः bashमेमोरी से बाहर निकल जाता है और इसे क्रैश कर देता है
डिजिटल ट्रॉमा

4
हाँ, वास्तव में यह करता है। लेकिन सवाल से एक दुर्घटना की अनुमति थी :)
GreenAsJade

हां, सिर्फ एक अवलोकन :)। Upvoted।
डिजिटल ट्रामा

वास्तव में, मुझे लगता है कि इस कार्यक्रम में थोड़ी सी भी गणना है कि वास्तव में आपकी मशीन दुर्घटनाग्रस्त हो जाती है, या सेवा के कुछ अन्य खंडन, बोनस अंक प्राप्त करना चाहिए)
ग्रीनएजजेड

सुधार: yesसिर्फ एक कोरूटिल्स प्रोग्राम है। सिस्कॉल नहीं।
मन्नीप

28

सी

पत्र "x" एक फ़ाइल में खो गया था। इसे खोजने के लिए एक कार्यक्रम लिखा गया था:

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

int main(int argc, char *argv[]) {
  FILE* fp = fopen("desert_file", "r");
  char letter;
  char missing_letter = argv[1][0];

  int found = 0;
  printf("Searching file for missing letter %c...\n", missing_letter);
  while( (letter = fgetc(fp)) != EOF ) {
    if (letter == missing_letter) found = 1;
  }
  printf("Whole file searched.\n");
  fclose(fp);
  if (found) {
    printf("Hurray, letter lost in the file is finally found!\n");
  } else {
    printf("Haven't found missing letter...\n");
  }
}

इसे संकलित किया गया और इसे चलाया गया और अंत में यह चिल्लाया:

Hurray, letter lost in the file is finally found!

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

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

int main(int argc, char *argv[]) {
  FILE* fp = fopen("desert_file", "r");
  unsigned char letter;
  unsigned char missing_letter = argv[1][0];

  unsigned int found = 0;
  printf("Searching file for missing letter %c...\n", missing_letter);
  while( (letter = fgetc(fp)) != EOF ) {
    if (letter == missing_letter) found = 1;
  }
  printf("Whole file searched.\n");
  fclose(fp);
  if (found) {
    printf("Hurray, letter lost in the file is finally found!\n");
  } else {
    printf("Haven't found missing letter...\n");
  }
}

वह अगले दिन कहर ढाने आया था। पत्र "ए" गायब था और भले ही यह "एबीसी" युक्त "डेजर्ट_फाइल" में होना चाहिए था, लेकिन कार्यक्रम इसे हमेशा के लिए प्रिंट करने के लिए खोज रहा था:

Searching file for missing letter a...

उन्होंने उस लड़के को बर्खास्त कर दिया और पिछले संस्करण में याद करते हुए कहा कि काम करने वाले कोड में कभी भी डेटाटाइप्स का अनुकूलन नहीं करना चाहिए।

लेकिन क्या सबक है जो उन्हें यहां सीखना चाहिए था?

सबसे पहले, यदि आप एससीआई तालिका पर एक नज़र डालते हैं, तो आप देखेंगे कि कोई ईओएफ नहीं है। ऐसा इसलिए है क्योंकि EOF एक चरित्र नहीं है, लेकिन fgetc () से लौटाया गया एक विशेष मान है, जो या तो फ़ाइल के अंत या -1 को दर्शाते हुए वर्ण को वापस लौटा सकता है।
जब तक हम हस्ताक्षरित चार का उपयोग कर रहे हैं तब तक सब कुछ अच्छी तरह से काम करता है - 50 के बराबर चार्ट fgetc () के साथ-साथ 50 के बराबर इंट में बढ़ाया जाता है। फिर हम इसे चार में बदल देते हैं और अभी भी 50 हैं। वही -1 या किसी अन्य आउटपुट के लिए होता है जो fgetc () से आता है।
लेकिन देखो, जब हम अहस्ताक्षरित चार का उपयोग करते हैं तो क्या होता है। हम fgetc () में एक चार से शुरू करते हैं और इसे int तक बढ़ाते हैं और फिर एक अहस्ताक्षरित char चाहते हैं। एकमात्र समस्या यह है कि हम अहस्ताक्षरित चार में -1 को संरक्षित नहीं कर सकते हैं। कार्यक्रम इसे 255 के रूप में संग्रहीत कर रहा है जो अब ईओएफ के बराबर नहीं है।

चेतावनी
यदि आप ANSI C दस्तावेज़ीकरण की धारा 3.1.2.5 प्रकारों पर एक नज़र डालते हैं, तो आपको पता चलेगा कि क्या चार पर हस्ताक्षर किए गए हैं या नहीं यह पूरी तरह से कार्यान्वयन पर निर्भर करता है। तो आदमी को शायद बर्खास्त नहीं किया जाना चाहिए क्योंकि उसे कोड में बहुत मुश्किल बग लपका। यह संकलक को बदलने या विभिन्न वास्तुकला में जाने पर बाहर आ सकता है। मुझे आश्चर्य है कि अगर इस तरह के मामले में बग सामने आया तो किसे निकाल दिया जाएगा;)

पुनश्च। कार्यक्रम पॉल ए कार्टर द्वारा पीसी असेंबली लैंग्वेज में उल्लिखित बग के आसपास बनाया गया था


7
मुझे पसंद है कि समाधान के साथ एक कहानी है।
jpmc26

Haha! मुझे लगता है कि यह केवल एक ही है। के माध्यम से पढ़ने के लिए धन्यवाद!
लेगट

1
मैं तुमसे प्यार करता हूँ। मुझे अपनी कहानियों के साथ फ़ीड करें pls :(
YoYoYonnY

यह बिल्कुल शानदार है!
kirbyfan64sos

21

regex

उपयुक्त इनपुट के साथ, निम्नलिखित रेगेक्स, बैकट्रैकिंग नर्क में जाने के लिए सबसे पीछे रेगेक्स इंजन का कारण बन सकता है:

^\w+(\s*\w+)*$

सरल इनपुट जैसे कि "Programming Puzzles and Code Golf Stack Exchange - Mozilla Firefox"या "AVerySimpleInputWhichContainsAnInsignificantSentence."(स्पष्टता के लिए उद्धृत दोनों स्ट्रिंग्स) लंबे समय तक चलने वाले अधिकांश रेक्सट्रैक रेगेक्स इंजनों को रखने के लिए पर्याप्त है।

चूंकि (\s*\w+)*विस्तार के लिए अनुमति देता है \w+\w+\w+... \w+, जिसका अर्थ है रेगेक्स इंजन मूल रूप से शब्द पात्रों की एक स्ट्रिंग को विभाजित करने के सभी संभावित तरीकों की कोशिश करेगा । यह पीछे वाले नरक का स्रोत है।
यह आसानी से बदल कर ठीक किया जा सकता \s*करने के लिए \s+है, तो (\s+\w+)*केवल करने के लिए विस्तारित किया जा सकता \s+\w+\s+\w+... \s+\w+


3
मुझे रेगेक्स इंजन से नफरत है।
डेविड कॉनरैड

2
मैंने पहले पर्ल के साथ यह कोशिश की थी, लेकिन ऐसा प्रतीत होता है कि पर्ल यहां एक लूप नोटिस कर सकते हैं। मैंने AWK की कोशिश नहीं की, क्योंकि कोई भी नियमित अभिव्यक्ति AWK में इस तरह के व्यवहार का कारण नहीं बन सकती। PHP स्वचालित रूप से नियमित अभिव्यक्ति करती है जो कि मिलान में बहुत लंबा समय लेती है (जो मूर्खतापूर्ण है, लेकिन वह आपके लिए PHP है - यह स्वचालित रूप से कार्यक्रमों में बग्स को सम्मिलित करता है)। हालांकि, यह वास्तव में पायथन में काम करता है।
कोनराड बोरोस्की

1
@ एक्सफ़िक्स: पेरल नरक से बचने के लिए क्यों कामयाब रहे, इस लेख में इसका कारण बताया गया है। हालांकि, यह मामले के खिलाफ पर्याप्त नहीं है जैसा कि यहां दिखाया गया है (प्रदर्शन अनुभाग पर स्क्रॉल करें)। PHP (वास्तव में PCRE लाइब्रेरी) की बैकड्रैकिंग सीमा होती है, और एक उचित कार्यक्रम को हमेशा यह तय करने के लिए फ़ंक्शन के वापसी मूल्य की जांच करनी चाहिए कि क्या निष्पादन रोक दिया गया था, या पूरा होने के लिए दौड़ा।
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
यह इतना ही बीमार है।
अल्वानेलोस

20

जावास्क्रिप्ट

function thiswillLoop(){
var mynumber = 40;
while(mynumber == 40){
mynumber = 050;
}
return "test";
}
thiswillLoop();

जावास्क्रिप्ट में 050 एक अष्टक स्थिरांक है, और ऐसा होता है कि दशमलव का मान 40 है।


73
मुझे यह स्पष्ट लगता है। :-)
जस्टिन

6
मुझे नहीं पता था कि जावास्क्रिप्ट ने ऐसा किया था। लेकिन कोड को पढ़ने के बाद मैंने कहा: "050 में 40 का प्रतिनिधित्व करने का कुछ तरीका होना चाहिए, शायद आधार 8 या कुछ और"
क्रंचर

इसे बेहतर तरीके से छिपाने की जरूरत है।
पाओलो एबरमन

यह स्पष्ट है ..
ओलिवर नी

18

हास्केल

head $ reverse $ (repeat '!') ++ "olleH"

खैर, यह सोचो! यह वैसा ही होगा head $ "Hello" ++ (repeat '!'), जैसे अभी लौटना चाहिए 'H'

हैस्केल सूची में पुनरावर्ती संरचनाएं हैं, जिसमें पहला तत्व सबसे ऊपर है। किसी सूची में शामिल होने के लिए, आपको उन सभी तत्वों को अनियंत्रित करना होगा, अपना परिशिष्ट रखना होगा, और हटाए गए तत्वों को वापस लाना होगा। यह एक अनंत सूची पर काम नहीं करेगा। इसी तरह, एक अनंत सूची को उलट देना जादुई रूप से आपको अपनी "Hello"पीठ नहीं देगा । यह हमेशा के लिए लटका रहेगा।


1
बहुत बुरा यह वास्तव में काम नहीं करता है: - /
जॉन Dvorak

1
यह कैसे काम नहीं करता है?
danmcardle

@ crazedgremlin जब मैंने Fedora पर यह परीक्षण किया तो OS ने अंततः इस प्रक्रिया को मार दिया। (<5 मिनट) क्योंकि यह सिस्टम पर सभी मेमोरी का उपयोग करता था।
FDinoff

दिलचस्प! मुझे महसूस नहीं हुआ कि ऐसा हुआ था। मैं अक्सर सब-के-सब स्मृति क्षेत्र में उद्यम नहीं करता।
danmcardle

4
यह अभी भी एक वैध समाधान है: यह बाहर नहीं निकलता है, यह तब तक चलता है जब तक यह सिस्टम इसे अब और समर्थन नहीं कर सकता ...
GreenAsJade

16

विंडोज के तहत जावा

public class DoesntStop
{
    public static void main(String[]a) throws InterruptedException, IOException
    {
        ProcessBuilder p = new ProcessBuilder("cmd.exe","/c","dir");
        p.directory(new File("C:\\windows\\winsxs"));
        Process P = p.start();
        P.waitFor();
    }
}

प्रोग्राम अटक जाने के लिए कमांडलाइन से जाम मानक आउटपुट स्ट्रीम पर निर्भर करता है। विंडोज़ के अंतर्गत WinSXS निर्देशिका में लंबे नाम वाली कई हज़ारों फाइलें हैं, इसलिए इसे लगभग क्लॉउडआउट की गारंटी दी गई है, और waitForयह वापस नहीं आ सकता है , इसलिए कार्यक्रम गतिरोधित है


1
शायद मैं सघन हो रहा हूँ, लेकिन क्या यह अंततः नहीं लौटेगा? बस कुछ देर लग सकती है। हो सकता है कि मुझे "clog [ging] stdout" से आपका मतलब न मिले।
एस्टेरि

4
यदि स्ट्रीम प्रोग्राम ब्लॉक को खाली नहीं करता है, तो इससे मुझे कुछ सिरदर्द पहले से ही हैं, इसलिए मैंने इसका उपयोग किया है; लंबी निर्देशिका केवल यह सुनिश्चित करती है कि बफर पूर्ण
मास्टरएक्स 244

आह, गच्चा। अच्छा! +1
एस्टेरि

15

सेब और संतरे की तुलना करने के लिए ... सी में

मैं प्रभावित हूँ कि कोड का कोई टुकड़ा यहाँ नहीं है goto... (आप जानते हैं: गोटो बुराई है! )

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

int main()
{
    char *oranges = "2";
    long int apples;

next_harvest:

    apples = random() % 3;

    printf("%ld apples comp. %s oranges ...\n", apples, oranges);

    if( apples != (long int)oranges )
    {
        sleep(1);
        goto next_harvest;
    }

    return 0;
}

नींद सिर्फ इसे पढ़ने में सक्षम होने के लिए है। प्रेस ^ C यदि आपके पास उस समय की अंतहीन राशि नहीं है जो कभी नहीं होती है, तो;


9
आप डरपोक कमीने हैं, गोटो इस में निर्दोष है :)
orion

यादृच्छिक () वोडू का उपयोग किया जाता है?
मास्टरएक्स २४४

1
आह, "2"! = 2; मिल गया
मास्टरएक्स 244

2
अच्छी तरह से "2" शायद कभी 2 नहीं हो सकता है, लेकिन यदि आपने एक बड़ी संख्या (और कम से कम 4 का एक गुणांक) का उपयोग किया है, तो यह हो सकता है;)
ओरियन

1
@orion: हाँ आप सही हैं, यह हो सकता है। और गोटो अभी भी बुराई है, लेकिन बुरे प्रकार की कास्टिंग और भी अधिक दुष्ट हैं!
अधिकतम 21

12

सी, कुछ अनुकूलन वाले संकलक के साथ

यह कार्यक्रम एक पूर्णांक चर को बढ़ाता है जब तक कि यह अधिक नहीं हो जाता।

#include <stdio.h>
#include <stdint.h>
int main()
{
    int32_t x = 0;
    while(x + 1 > x)
        x++;
    printf("Got overflow!\n");
    return 0;
}

हस्ताक्षरित पूर्णांक अतिप्रवाह अपरिभाषित व्यवहार है। आमतौर पर अभ्यास में यह लपेटता है, जब अनुकूलन बंद हो जाते हैं। पर अनुकूलन के साथ, संकलक कर सकते हैं और निर्णय लेते हैं जो x + 1 > xहमेशा सच होता है।


शायद उपयोग करें int32_t; 64 बिट इंट वास्तव में, वास्तव में, बहुत लंबा (585 साल अगर प्रत्येक पुनरावृत्ति एक नैनोसेकंड लेता है) ले जाएगा।
पॉल ड्रेपर

11

सी ++

int main()
{
  int x = 1;
  //why doesn't this code terminate??/
  x = 0;
  while(x) {} //no-op/
  return 0;
}

अजीब टिप्पणी शैली चाल है। संकेत: ट्रिगर।


यह अनंत लूप का एक बहुत ही बुनियादी उदाहरण है।
इस्माईल मिगुएल


75
मैं लगभग महसूस करता हूं कि ट्रिग्राफ को स्टैंडर्ड लोफॉल्स में रखा जाना चाहिए जो कि लंबे समय तक मज़ेदार नहीं हैं।
भूमिगत

6
@ TheDoctor: ?? / बैकस्लैश कैरेक्टर के लिए एक ट्रिग्राफ है, इसलिए बैकस्लैश उस लाइन को हटा देता है, जहां x को टिप्पणी के अंत में 0 असाइन किया गया है, जो इसे टिप्पणी का हिस्सा बनाता है।
कासाडेबोरसन

4
@undergroundmonorail ने पोस्ट किया
जस्टिन

11

जावा

मैं ऑटोबॉक्सिंग अनुकूलन के इस दुष्प्रभाव को विशेष रूप से पसंद करता हूं:

class BoxingFun {
  public static void main( String[] args) {
    Integer max;
    Integer i;

    max = 100;
    for( i = 1; i != max; i++ ) {
      System.out.println("Not endless");  
    }
    max = 200;
    for( i = 1; i != max; i++ ) {
      System.out.println("Endless");  
    }
  }
}

Autoboxing की वजह से, Integerवस्तुओं लगभग सादे की तरह व्यवहार intएक अपवाद के साथ, रों यहाँ: i != maxमें forछोरों तुलना संदर्भ की (पहचान) Integerवस्तुओं, नहीं उनके मूल्य (समानता)। 100 तक के मानों के लिए यह आश्चर्यजनक रूप से "काम करता है" फिर भी जेवीएम में अनुकूलन के कारण: जावा Integer"सबसे सामान्य मूल्यों" के लिए वस्तुओं का प्रचार करता है और ऑटोबॉक्सिंग होने पर उन्हें पुन: उपयोग करता है। तो 100 तक के मूल्यों के लिए हमारी पहचान <==> समानता है।


5
यह देखते हुए कि कुछ जावा लोग अभी भी C ++ ऑपरेटर-ओवरलोडिंग को बुराई मानते हैं ...
डैनियल

आपको इनिशियलाइज़ेशन की आवश्यकता नहीं है = new Integer(0), क्योंकि आप वैसे भी मानों को इनिशियलाइज़ कर रहे हैं। (यह कारण को कम स्पष्ट कर सकता है।)
पाओलो एबरमन

@ Pa @loEbermann: अच्छी बात है, मैंने कोड को संपादित किया है।
डैनियल

9

रूबी / सी

#include <stdio.h>
#ifdef llama
def int(*args)
end
def main(arg)
  yield
end
void = nil
#endif
#define do {
#define end }
int main(void) {
  int x = 10;
  while(x-=1) do
    printf("%i\n",x);
  end
    return 0;
}

यह C में सही तरीके से काम करता है , STDOUT में 9 से 1 तक की गिनती। जब रूबी में चलाया जाता है, तो यह समाप्त नहीं होता है, क्योंकि

0 रूबी में गलत मान नहीं है।


भाषाएं एक बार में करें ... प्रभावशाली।
पॉल ड्रेपर

7

जावास्क्रिप्ट

// This multiplies the elements in the inner lists and sums the results.
function sum_of_products(var items)
{
        var total = 0;
        for(var i = 0; i < items.length; i++) {
                var subitems = items[i];
                var subtotal = 1;
                for(var i = 0; i < subitems.length; i++) {
                        subtotal *= subitems[i];
                }       
                total += subtotal;
        }
        return total;
}

// Should return 1*2 + 3*4*5 + 6*7*8*9 + 10*11 = 3196
sum_of_products([[1, 2], [3, 4, 5], [6, 7, 8, 9], [10, 11]]);

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


यह कौनसी भाषा है?
रोनेनडेक्स

@ronondex जावास्क्रिप्ट
tomsmeding

1
आह, हाँ, यह जावास्क्रिप्ट है। मुझे वाक्य रचना में
बाधा डालना

1
मुझे यह स्पष्ट लगता है। :-)
राफेलकास्ट्रोकोटो

@rafaelcastrocouto हाँ, यह एक तरह का है, लेकिन यह भी वास्तव में याद करना आसान है, उदाहरण के लिए जब एक फ़ंक्शन से दूसरे पर एक लूप को स्थानांतरित करना या कोड पर सिर्फ नज़र रखना। इसके अलावा, ध्यान दें कि यह वास्तव में चर छायांकन के कारण C सहित कुछ भाषाओं में सही ढंग से काम करता है। :)
१०:०४ पर अलेक्सी तोरहमो

7

सी

यह सभी ASCII वर्णों के लिए 0 से 255 तक के लिए एक कोड तालिका मुद्रित करना चाहिए। ए charउन पर पुनरावृति करने के लिए पर्याप्त है।

#include <stdio.h>

int main(){
    char i;
    for(i = 0; i < 256; i++){
        printf("%3d 0x%2x: %c\n", i, i, i);
    }
    return 0;
}

सभी चार्ट 256 से कम हैं। 255 ++ ओवरफ्लो के कारण 0 देता है, इसलिए स्थिति i < 256हमेशा पकड़ में रहती है। कुछ संकलक इसके बारे में चेतावनी देते हैं, कुछ नहीं।


बनाने के लिए ऐसा लगता है कि कुछ अधिक उपयोगी है, शायद printf("%3d %2x: %c", i, i, i);अपने लूप में कुछ ( जैसे एक कोड तालिका के लिए) का उपयोग करें।
पाओलो एबरमन

@ Pa @loEbermann: महान विचार।
राफेल सिलेक

मैं अपनी कक्षा में इस ट्रिक का उपयोग 32 और 128 के बीच मुद्रण योग्य अहस्ताक्षरित वर्णों के साथ करता हूं। :)
cpri

7

अजगर

a = True
m = 0
while a:
    m = m + 1
    print(m)
    if m == 10:
        exit

यह होना चाहिए exit()और नहीं exit। जैसा कि मैं इसे समझता हूं, exit()अजगर दुभाषिया से बाहर निकलने की आज्ञा है। इस मामले में कॉल फ़ंक्शन के प्रतिनिधित्व के लिए है और फ़ंक्शन को देखने के लिए नहीं: बाहर निकलने की चर्चा । वैकल्पिक रूप breakसे एक बेहतर विकल्प होगा।


क्या आप बता सकते हैं कि exitवास्तव में क्या है? यह एक वर्ग लगता है, लेकिन इसका उपयोग किस लिए किया जाता है? तुम भी बदल सकता है print mकरने के लिए print(m)तो यह भी अजगर 3. के साथ काम करता है कि
मार्टिन थोमा

1
उन चीजों के प्रकार ... जैसे कि जब मेरे फारस काम नहीं करता था, क्योंकि यह एलिफ था ।
अनाम पी

@mooseअपडेटेड प्रिंट स्टेटमेंट और स्पॉइलर संदेश को धन्यवाद
विलेम

6

सी ++

शास्त्रीय सी ++ के बारे में कैसे - प्रोग्रामर का जाल?

int main()
{
   bool keepGoing = false;

   do {
       std::cout << "Hello, world!\n";
   } while( keepGoing = true );

   return 0;
}

मुझे यह नहीं मिला? क्या यह उपयोग करने के बारे में है। = के बजाय ==?
मम्मड़

@ user689 बिल्कुल। keepGoing = trueके मूल्य की तुलना करने के लिए था keepGoing, इसके बजाय यह मान प्रदान करता है keepGoing; पूरे विवरण के अलावा एक अनन्त लूप के लिए अग्रणी (जो कि आपको चीजों को लिखने की अनुमति देता है) का keepGoing = trueमूल्यांकन trueकरता है a=b=c=d=0
कम्पूसी

3
यह कभी-कभी योदा स्थितियों का उपयोग करने का अधिक कारण होता है।
रयान

@RyanEdwardDougherty Haha जैसा कि मैंने उन्हें कभी नहीं सुना जा रहा है। सुबह की हंसी के लिए धन्यवाद।
कंपूचिप

@ रियानएडवर्ड डफ़्टी: बेशक == true(या योदा-शैली true ==) वैसे भी बेमानी है, और शर्त बस पढ़नी चाहिए while (keepGoing)
celtschk

6

जावास्क्रिप्ट

var а = 0;
a = 1;
while(а<10){
    a++;
}

1 और 3 लाइन में उपयोग किए जाने वाले चर 2 और 3 लाइन में उपयोग किए गए लोगों से अलग हैं।
एक का उपयोग करता है एक (U + 0061) अन्य का उपयोग करता है, जबकि а (U + 0430)


मुझे यहाँ कोई समस्या नहीं दिख रही है। मैंने इसे चलाया और यह ठीक काम किया। मैं क्या खो रहा हूँ?
एंड्रयू शेफर्ड

यह संभवतः हर जगह काम करेगा क्योंकि यूनिकोड संभवतः परिवर्तित हो जाएगा। एक +1 मिला क्योंकि यह सबसे अदृश्य है जैसा कि आप प्राप्त कर सकते हैं!
राफेलकास्ट्रोकोटो

बस इसे पूरी तरह से छिपाने के लिए (U + 0430 के साथ á को बदलें) यदि यह आपका कोड था, तो समस्या को खोजने का सौभाग्य: var a;var points = 0;function fiftyfifty() {points++;if (Math.random() > 0.5)return true;}; á = fiftyfifty(); while (a === undefined) {á = fiftyfifty();} console.log("Points: " + points);मैं हार मानूंगा, इसे हमेशा के लिए मिटा दूंगा, अपने कंप्यूटर को साफ कर दूंगा, शायद वायरस स्कैनर बस सुनिश्चित हो जाए और इसे पूरी तरह से फिर से लिखना। संपादित करें: क्योंकि var a = 0; a = 1;बहुत यथार्थवादी नहीं है
YoYoYonnY

6

जावा:

public class LoopBugThing{
   public static void main(String[] args)
   {
      int i = 0;
      while(i < 10)
      {
         //do stuff here
         i = i++;
      }
      System.out.println("Done!");
   }
}

"I = i ++" एक बहुत ही सामान्य शुरुआती गलती है और इसे खोजने के लिए आश्चर्यजनक रूप से कठिन हो सकता है


5

सी ++

थोड़ा यादृच्छिक?

class Randomizer
{
   private:
   int max;

   public:
   Randomizer(int m)
   {
      max = m;
      srand(time(NULL));
   }

   int rand()
   {
      return (rand() % max);
   }
};

int main()
{
  Randomizer r(42);
  for (int i = 0; i < 100; i++)
  {
     i += r.rand();
  }
  return (0);
}

फ़ंक्शन को कॉल नहीं करता है, randबल्कि इसके बजाय पुनरावर्ती Randomizer::randफ़ंक्शन को कॉल करता है।


5
रिटर्न स्टेटमेंट में अतिरिक्त कोष्ठक, yuck।
डेविड कॉनरैड

1
यह अंततः सेगफॉल्ट होगा , हालांकि।
kirbyfan64sos

5

हास्केल

एकरमन फ़ंक्शन के दिए गए मान की गणना के लिए समय के लिए कुछ कोड। बहुत कम मूल्यों के लिए यह आमतौर पर समाप्त हो जाता है। मेरी मशीन पर बहुत कम मानों का मतलब है 3 5 जैसा या संकलित कोड के साथ छोटा और -O। Gci में निम्न मानों का अर्थ है 3 3।

'प्रतीक गंदगी वाक्य रचना हाइलाइटिंग, यकीन नहीं क्यों लगता है। कुछ स्थानों पर इनकी आवश्यकता होती है इसलिए ये सभी को हटा नहीं सकते हैं।

संपादित- परिवर्तित भाषा।

{-# LANGUAGE NamedFieldPuns #-}
import Control.Concurrent.STM
import Control.Concurrent
import Data.Time.Clock.POSIX

data D = D { time :: !POSIXTime
           , m :: !Integer
           , n :: !Integer
           , res :: !(Maybe Integer)
           } deriving Show

startvalue = D 0 3 8 Nothing

-- increment time in D. I belive lensen make code like
-- this prettier, but opted out.
inctime t t' (d@D{time}) = d {time = time + t' - t }

-- Counting time
countTime :: TVar D -> POSIXTime -> IO ()
countTime var t = do
    t' <- getPOSIXTime
    atomically $ modifyTVar' var (inctime t t')
    countTime var t'

-- Ackermann function
ack m n
    | m == 0    = n + 1
    | n == 0    = ack (m - 1) 1
    | otherwise = ack (m - 1) (ack m (n - 1))

-- Ackerman function lifted to the D data type and strict
ack' (d@D{m, n}) = let a = ack m n
                   in seq a (d { res = Just a })

-- fork a counting time thread, run the computation
-- and finally print the result.
main = do
    d <- atomically (newTVar startvalue)
    forkIO (getPOSIXTime >>= countTime d)
    atomically $ modifyTVar' d ack'
    (atomically $ readTVar d) >>= print

यह एक लाइवलॉक का कारण बनता है। काउंटिंग थ्रेड बार-बार एकरमैन गणना का कारण बनता है क्योंकि वे एक ही टीवीर को छूते हैं।


लैंग-हस्केल के बजाय इसे लैंग-एचएस के रूप में चिह्नित करना बेहतर काम करता है (यह गूगल
प्रेटिफ़ायर

5

जावा - कोई छोर या पुनरावृत्ति नहीं

मैंने अभी नियमित अभिव्यक्ति सीखना शुरू किया है और यह जानने के लिए कि मेरा स्ट्रिंग नियमित अभिव्यक्ति से मेल खाता है या नहीं, यह परीक्षण करने के लिए मैंने अपना पहला कार्यक्रम लिखा था।

दुर्भाग्य से, कार्यक्रम कोई परिणाम नहीं देता है। यह टर्मिनल रखती है। कृपया समस्या खोजने में मदद करें। मैंने लूप का कोई उपयोग नहीं किया है, इसमें कोई पुनरावृत्ति शामिल नहीं है। मैं पूरी तरह से चकरा गया हूं।

import java.util.regex.*;

public class LearnRegex {
     public static void main(String[] args) {
         Pattern p = Pattern.compile("(x.|x.y?)+");
         String s = new String(new char[343]).replace("\0", "x");
         if (p.matcher(s).matches())
             System.out.println("Match successful!");
     }
}

मैंने क्या गल्त किया है? मेरा कार्यक्रम समाप्त क्यों नहीं होता? कृपया सहायता कीजिए!

Ideone लिंक यहाँ

यह भयावह बैकट्रैकिंग का एक मूर्ख उदाहरण है । जटिलता ओ (2 एन / 2 ) है। हालांकि कार्यक्रम अनिश्चित काल तक नहीं चल सकता है, यह संभवतः जीवित और गैर-जीवित वस्तुओं के आसपास और न- आसपास दोनों को रेखांकित करेगा ।


5

सी

आपको केवल दो छोरों में से एक की आवश्यकता होनी चाहिए, लेकिन जो आपको चाहिए वह आपके कंपाइलर पर निर्भर करता है।

main()
{
        int i, a[10];

        i = 0;
        while (i <= 10) {
            i++;
            a[i] = 10 - i;
            printf("i = %d\n", i);
        }

        /* Now do it in reverse */

        i = 10;
        while (i >= 0) {
            i--;
            a[i] = 10 - i;
            printf("i = %d\n", i);
        }

}

एक साधारण सीमा समाप्त हो जाती है जो मुझे गैर-समाप्ति मूल्य पर रीसेट करती है । संकलनकर्ता कि क्या वे आवंटित पर अलग हो सकता है मैं ऊपर या नीचे एक ढेर पर है, इसलिए मैं दोनों दिशाओं में बढ़ शामिल किया है।


5

C / C ++

C ++ केवल आसान इनलाइन वैरिएबल घोषणाओं का उपयोग करने की अनुमति देता है, लेकिन सादे पुराने C में यह गलती करना आसान है ...

#include <stdio.h>

int main(void)
{
    int numbers[] = {2, 4, 8};

    /* Cube each item in the numbers array */
    for(int i = 0; i < 3; i++) {
      for(int j = 0; j < 3; i++) {
        numbers[j] *= numbers[j];
      }
    }

    /* Print them out */
    for(int i = 0; i < 3; i++) {
      printf("%d\n", numbers[i]);
    }

    return 0;
}

आंतरिक लूप में, 'जे' की तुलना की जाती है, लेकिन कभी भी वृद्धि नहीं की जाती है। ('I ++' वास्तव में 'j ++' होना चाहिए)। यह इतना डरपोक चाल नहीं है, लेकिन मैं अतीत में की गई एक वास्तविक त्रुटि के अधिक है;) कुछ के लिए बाहर देखने के लिए।


2
यह आमतौर पर मुझे डिबग करने में कम से कम 5 मिनट लगते हैं। जब मैंने ऐसा किया तो मुझे इससे नफरत है।
ace_HongKongInd डिपेंडेंस

4

सी#

निम्नलिखित एक साधारण वर्ग है जो पृष्ठभूमि के थ्रेड का उपयोग करके एक बड़े इनपुट सरणी पर एक अंकगणितीय ऑपरेशन (योग) करता है। एक नमूना कार्यक्रम शामिल है।

हालाँकि, यह बहुत सीधा होने के बावजूद, यह कभी समाप्त नहीं होता है। ध्यान दें कि हाथ की कोई चिकनाई नहीं है (वर्ण लुकलेस, छिपे हुए / लापता अर्धविराम, ट्रिग्राफ; ;-), आदि)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

class Program
{
    static void Main()
    {
        var summer = new BackgroundSummer(Enumerable.Range(1, 1234567));
        Console.WriteLine(summer.WaitAndGetResult());
    }
}

public class BackgroundSummer
{
    private IEnumerable<int> numbers;
    private long sum;
    private bool finished;

    public BackgroundSummer(IEnumerable<int> numbers)
    {
        this.numbers = numbers;
        new Thread(ComputingThread).Start();
    }

    public long WaitAndGetResult()
    {
        while (!finished) { /* wait until result available */ }
        return sum;
    }

    private void ComputingThread()
    {
        foreach(var num in numbers)
        {
            sum += num;
        }
        finished = true;
    }
}

यह एक वास्तविक दुनिया गंदा बग का उदाहरण है जो आपके कोड में भी दिखाई दे सकता है। .NET मेमोरी मॉडल और C # विनिर्देश के अनुसार, एक लूप जैसे कि WaitAndGetResultकभी भी समाप्त नहीं हो सकता जब तक कि आप वेरिएबल को अस्थिर के रूप में निर्दिष्ट न करें, क्योंकि यह किसी अन्य थ्रेड द्वारा संशोधित किया गया है। देखें इस StackOverflow सवाल जानकारी के लिए। बग .NET .NET कार्यान्वयन पर निर्भर है, इसलिए यह आपको प्रभावित कर सकता है या नहीं। लेकिन आमतौर पर, x64 प्रोसेसर पर रिलीज़ बिल्ड चलाने से समस्या प्रदर्शित होती है। (मैंने इसे "csc.exe / o + / debug- infinite.cs" के साथ आज़माया ।)

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