2016-10-12 11 views
20

int i = 5 जैसी घोषणा का वापसी मूल्य/प्रकार क्या है?परिवर्तनीय घोषणा लूप की स्थिति के रूप में अच्छी तरह से क्यों काम करती है?

क्यों इस कोड संकलन नहीं करता है: जबकि इस

#include <iostream> 

void foo(void) { 
    std::cout << "Hello"; 
} 

int main() 
{ 
    int i = 0; 
    for(foo(); int i = 5; ++i)std::cout << i; 
} 
+1

क्योंकि 'int i = 5' मान्य अभिव्यक्ति नहीं है? और आपको कोष्ठक में एक वैध अभिव्यक्ति की आवश्यकता है। –

+0

भले ही आपका दूसरा प्रोग्राम संकलित हो, फिर भी आपको एक अनंत लूप में मारा जाएगा। यह टर्मिनल पर '5' प्रिंटिंग रखेगा। – abhiarora

+1

चीजों को और भी दिलचस्प बनाता है कि यदि आप 0 से शुरू करते हैं तो यह झूठा होता है। –

उत्तर

25

for पाश या तो होना करने के लिए हालत की आवश्यकता है एक अभिव्यक्ति या एक घोषणा:

हालत - या तो

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

क्योंकि (int i = 5)==5 एक वैध expression बिल्कुल नहीं है 1 कोड काम नहीं करता। (यह या तो घोषणा नहीं है।) operator== का ऑपरेशन भी एक अभिव्यक्ति माना जाता है, लेकिन int i = 5 एक घोषणा है, अभिव्यक्ति नहीं।

दूसरा कोड काम करता है क्योंकि int i = 5स्थिति के लिए दूसरे मान्य मामले से मेल खाता है; बराबर प्रारंभकर्ता के साथ एक एकल चर की घोषणा। i का मान निर्णय के लिए bool में परिवर्तित कर दिया जाएगा; जो हमेशा 5 है, फिर एक अनंत लूप की ओर जाता है।

+1

मुझे पता नहीं था संपादित करने के लिए स्वतंत्र लग रहा है आप पाश के लिए एक की हालत भाग में एक चर घोषित सकता है! –

2
करता

#include <iostream> 

void foo(void) { 
    std::cout << "Hello"; 
} 

int main() 
{ 
    int i = 0; 
    for(foo(); (int i = 5)==5 ; ++i)std::cout << i; 
} 

इस कोड acutally अनुपालन करे:

for (foo(); int i = 5 == 5; ++i) 

यह जाँच करता है, तो 5 == 5 और इस के लिए मैं सेट बूलियन परिणाम (जो 1 है) -> अनंत लूप

for(foo(); int i = 5; ++i) 

यह केवल 5 के लिए सेट किए जाने के बाद i का मूल्य की जाँच करता है, तो ... जब bool करने के लिए परिवर्तित यह हमेशा true है साथ ही साथ -> अनंत लूप

+0

'i! = NULL' थोड़ा अजीब है, आप का मतलब हो सकता है 'मैं! = झूठा'? – songyuanyao

+0

के बाद से शून्य == 0, मैं कुछ भी यहाँ अजीब नहीं देखते हैं, मैं एक boolean.Anyway नहीं है, इस सवाल का जवाब ऊपर रास्ता बेहतर है;) – Treycos

+0

दरअसल, 'मैं' घ 'bool' में परिवर्तित हो जाएगा का मूल्य , फिर निर्णय के लिए इस्तेमाल किया; इस प्रक्रिया में 'NULL' या' 0' शामिल नहीं है। वैसे भी, परिणाम वही है। – songyuanyao

0

सी प्रोग्रामिंग भाषा में पाश के लिए एक की वाक्य रचना इस प्रकार है:

for (init; condition; increment) { 
    statement(s); 
} 

init कदम पहले निष्पादित किया जाता है, और केवल एक बार। आप में इनिट का उपयोग किसी भी लूप नियंत्रण चर घोषित और प्रारंभ कर सकते हैं।

अगला, स्थिति का मूल्यांकन किया जाता है। यदि यह सत्य है, तो लूप का निकाय निष्पादित किया गया है। यदि यह गलत है, तो लूप का शरीर निष्पादित नहीं होता है और नियंत्रण के प्रवाह को '0' लूप के ठीक बाद अगले कथन में कूदता है।

'फॉर' लूप निष्पादित करने के बाद, नियंत्रण का प्रवाह बढ़ता बयान तक वापस कूदता है। यह कथन आपको किसी भी लूप नियंत्रण चर अद्यतन करने की अनुमति देता है।

ध्यान में रखते हुए अपने पहले कार्यक्रम बयान:

error: expected primary-expression before ‘int’ 
     for(foo(); (int i = 5) == 5; ++i)std::cout << i; 

    error: expected ‘)’ before ‘int’ 
C में

प्राथमिक अभिव्यक्ति काफी के किसी भी हो सकता है:

for(foo(); (int i = 5)==5 ; ++i)std::cout << i; 

ऊपर बयान आप त्रुटि (संकलित जीसीसी का उपयोग) निम्नलिखित दे देंगे चीजों की संख्या:

a name (of a variable or a function) 
a typename 
an operator 
a keyword like if or while 
the list goes on and on ... 

यह त्रुटि इस तथ्य के कारण है कि कथन (int i = 5) == 5 मान्य अभिव्यक्ति नहीं है और संकलक किसी अन्य तरीके से व्याख्या करने की कोशिश कर रहा है। हालांकि, दूसरा प्रोग्राम int i = 5 के रूप में काम करता है condition लूप के लिए जांच के लिए वैध स्थिति के रूप में उपयोग किया जा सकता है क्योंकि इस तरह के घोषणा initializer के मान पर मूल्यांकन करती है जो आपके दूसरे कार्यक्रम में 5 है। हालांकि, दूसरा प्रोग्राम एक अनंत लूप होगा और टर्मिनल पर 5 प्रिंटिंग रखेगा। हालांकि, अगर प्रारंभकर्ता का मान 0 था, तो स्थिति इसकी पहली जांच में झूठी झूठी होती है और for लूप बॉडी को एक बार भी निष्पादित नहीं किया जाएगा।

+0

उद्धरण दिया था कहते हैं, "हालत" भाग में चर घोषित करने के बारे में कुछ भी नहीं है, यह केवल "init" भाग (जो संकेत होता है कि घोषणाओं अन्य भागों में अनुमति नहीं है) में घोषणाओं का उल्लेख है। इसके अलावा, सी और सी ++ के बीच मतभेद हो सकते हैं। – ilkkachu

+0

मैंने इसका उल्लेख नीचे दिया है "हालांकि, दूसरा प्रोग्राम int i = 5 घोषणा के रूप में काम करता है, लूप के लिए स्थिति जांच के लिए वैध स्थिति के रूप में उपयोग किया जा सकता है क्योंकि इस तरह की घोषणा प्रारंभिक के मान पर मूल्यांकन करती है जो आपके दूसरे प्रोग्राम में 5 है।" – abhiarora

-3

हालांकि लूप के वाक्यविन्यास के अनुसार प्रारंभिक विवरण पहले आना चाहिए, और फिर जांच और फिर अद्यतन, क्योंकि आपका चेकिंग स्टेटमेंट दूसरे उदाहरण में प्रारंभिक है, इसलिए मुझे जांच के हिस्से के रूप में 5 के रूप में प्रारंभ किया गया है और लूप जारी है। के रूप में वापसी प्रकार शून्य है

प्रारंभ में foo() कॉल का उपयोग करते हुए पाश के लिए करने के लिए कोई फर्क नहीं पड़ता, यदि आप foo() के स्थान पर 0 शब्दों में कहें, तो आप एक ही उत्पादन मिल जाएगा

अब आइए पहले उदाहरण पर विचार करें, आपका चेकिंग कथन एक प्रारंभिक उदाहरण है, जैसा कि दूसरे उदाहरण की तरह है, और यदि आपके पास उन ब्रैकेट्स नहीं हैं तो यह काम करेगा। चूंकि एक घोषणा किसी भी मूल्य को वापस नहीं करती है, (int i = 5) कोई मान वापस नहीं करता है और इसलिए "== 5" में 5 के साथ तुलना नहीं की जा सकती है।

हालांकि, अगर आप कोशिश "के लिए (foo(); int i = 5 == 5; ++ i) ...", जाँच बयान पूर्णांक मैं = (5 के रूप में ही संकलित = = 5)। चूंकि 5 == 5 सत्य है, यह 1 का मान देता है, जिसे तब i के मान के रूप में प्रारंभ किया जाता है। इस प्रकार आउटपुट 11111 ......

टीएल; डीआर: चूंकि एक घोषणा किसी भी मूल्य को वापस नहीं करती है, (int i = 5) कोई मान वापस नहीं करता है और इसलिए इसकी तुलना 5 में नहीं की जा सकती है "== 5" जैसा कि पहले उदाहरण में

समस्या हल हो गई।

+0

_ "चूंकि एक घोषणा किसी भी मूल्य को वापस नहीं करती है, (int i = 5) ... की तुलना नहीं की जा सकती है ..." _ - ठीक है, लेकिन सवाल यह ठीक लगता है कि यह _can_ क्यों है, हालांकि, इसकी तुलना पूरी तरह से की जा सकती है दूसरे उदाहरण में सत्यता के लिए। क्या आपके उत्तर में कोई विरोधाभास नहीं है? मैं नहीं देखता कि कैसे int int = 5 == 5' इसके लिए आता है, क्योंकि यह 'int i = 1' कहने का एक अजीब तरीका है, जो प्रश्न में स्निपेट के समान है। – ilkkachu

+0

कह रहा है int i = 1 जांच कथन में एक घोषणा है, संकलक तब तक परवाह नहीं करता जब तक कथन निष्पादन योग्य नहीं होता है। तो जांचने की बजाय इसे जांचने के बजाय, यह 1 से शुरू होता रहता है। यदि किसी शर्त में प्रारंभिक करने का प्रयास करें। कुछ ऐसा है जैसे (i = 1) {...} इस मामले में, मुझे 1 में प्रारंभ किया गया है और यदि कथन निष्पादित किया गया है। – Zac

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

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