2012-11-16 18 views
6

के बाद अर्धविराम का प्रभाव कहें कि मैं for लूप का उपयोग करके पांच बार सी में एक संदेश मुद्रित करना चाहता हूं।'फॉर' लूप

for (i=0;i<5;i++); 

संदेश मुद्रित नहीं प्राप्त करता है 5 बार, लेकिन यह करता है अगर मैं वहाँ अर्धविराम डाल नहीं है: ऐसा क्यों है कि अगर मैं इस तरह पाश के लिए के बाद अर्धविराम जोड़ने है?

उत्तर

8
for (i=0;i<5;i++); 

को

for (i=0;i<5;i++){} 
23

अर्द्धविराम बराबर है एक वैध बयान अशक्त बयान* मतलब यह है कि "कुछ भी नहीं" कहा जाता है। चूंकि for लूप एक एकल ऑपरेशन निष्पादित करता है (जो {} में संलग्न ब्लॉक हो सकता है) अर्धविराम को लूप का शरीर माना जाता है, जिसके परिणामस्वरूप आपने देखा व्यवहार होता है। पांच बार for (i=0;i<5;i++)

  • ... (अर्धविराम) कुछ नहीं कर स्थानीय चर के लिए एक नया गुंजाइश
  • ओपन

    • दोहराएँ: इस प्रकार

      निम्नलिखित कोड

      for (i=0;i<5;i++); 
      { 
          printf("hello\n"); 
      } 
      

      व्याख्या की है {

    • ... प्रिंट करें "हैलो"
    • गुंजाइश }

    बंद आप देख सकते हैं, आपरेशन दोहराया जाता है कि ;, नहीं printf है।


    *K&R, खंड 1.5.2

  • +2

    अर्धविराम एक "ऑपरेटर" नहीं है। यह एक "कथन" को समाप्त करता है, और यह कथन के लिए कुछ भी शामिल नहीं है। कुछ कंपाइलर इस बारे में चेतावनी देते हैं क्योंकि यह एक आम गलती है। खाली ब्रेसिज़ '{}' कुछ भी करने का पसंदीदा तरीका नहीं है। – ams

    +0

    अर्धविराम एक * punctuator * है लेकिन एक * ऑपरेटर * नहीं है। – ouah

    +0

    @ams कृपया एक संपादन देखें। मैं इसे ऑपरेटर कहने में गलत था, यह एक बयान है (कम से कम के एंड आर के अनुसार) – dasblinkenlight

    3

    सिर्फ ; टोकन से मिलकर बयान अशक्त बयान कहा जाता है देखें और यह सिर्फ करता है ... कुछ भी नहीं है।

    उदाहरण के लिए, इस मान्य है:

    void foo(void) 
    { 
        ; 
        ; 
        ; 
    } 
    

    यह हर जगह इस्तेमाल किया जा सकता एक बयान में उदाहरण के लिए, इस्तेमाल किया जा सकता:

    (C99, 6.8.3p3) "A null statement (consisting of just a semicolon) performs no operations."

    :

    if (bla) 
        ; 
    else 
        ; 
    

    सी स्टैंडर्ड पैरा देखें

    1

    नीचे यह कोड "हैलो" 5 बार प्रिंट करेगा ..

    for(i=0;i<5,printf("Hello\n");i++); 
    
    +1

    दरअसल, कोई भी हैलो 5 बार प्रिंट नहीं करेगा; यह हैलो एक अनिश्चित काल की बड़ी संख्या मुद्रित करेगा। ऐसा इसलिए है क्योंकि स्थिति 'i <5, printf (" हैलो \ n "); 'और अल्पविराम ऑपरेटर इसके एलएचएस (' i <5') का मूल्यांकन करता है और परिणाम को अनदेखा करता है, फिर आरएचएस ('printf (" हैलो का मूल्यांकन करता है \ n ")'), जो 6 देता है क्योंकि यह मानक आउटपुट में 6 वर्ण लिखता है; क्योंकि 6 सत्य है (यह शून्य नहीं है), लूप जारी रहता है, अनिश्चित काल तक। जीसीसी ('-Werror' सहित) के लिए मेरे डिफ़ॉल्ट कंपाइलर विकल्पों के साथ, कोड संकलित नहीं होता है: 'त्रुटि: अल्पविराम अभिव्यक्ति के बाएं हाथ के संचालन का कोई प्रभाव नहीं पड़ता है [-Werror = unused-value]'। –

    0

    कई compilers में सिंटेक्स त्रुटि दिखा सकते पाश के लिए एक के बाद एक अर्धविराम डाल लेकिन जीसीसी संकलक (लिनक्स) या देव-सीपीपी के अनुसार आप पाश के लिए एक के बाद एक अर्धविराम डाल सकते हैं और यह आपको किसी भी त्रुटि नहीं दिखाया जाएगा।

    उदाहरण के लिए

    for(int i=0;i<=5;i++); 
    

    या

    for(int i=0;i<=5;i++) 
    {//blank body} 
    

    ऊपर के उदाहरण यह स्पष्ट है कि अगर हम पाश मतलब है कि हम अभी तक किसी भी चर दर्ज नहीं किया है के लिए के बाद खाली ब्रेसिज़ या अर्धविराम डाल से।

    अब अपने प्रश्न पर आएं।
    आप हैलो मुद्रित करने के लिए पांच बार चाहते हैं, आप अपने कार्यक्रम

    रूप
    for(int i=0;i<5;i++) 
    { 
        printf("hello"); 
    } 
    

    मुझे आशा है कि आप
    चियर्स समझ में लिखने के लिए है !!
    राहुल वशिष्ठ

    संबंधित मुद्दे