2011-06-19 17 views
5

वे अलग कैसे हैं? यहां मैं क्या सोच रहा हूं, लेकिन मुझे यकीन नहीं है ....पूर्व वृद्धि वृद्धि बनाम पोस्ट-वृद्धि

यदि आप पूर्व-वृद्धि का उपयोग करते हैं, उदाहरण के लिए ++ j के साथ लूप के लिए, तो आप मूल रूप से कह रहे हैं: "एक प्रति बनाएं लूप में उपयोग के लिए जे का मूल्य, फिर वृद्धि जे, फिर लूप में कथन के माध्यम से जे की प्रतिलिपि के माध्यम से जाओ। " यदि आप उसी लूप जे ++ में पोस्ट-इंक्रिमेंटेशन का उपयोग कर रहे हैं, तो आप मूल रूप से कह रहे हैं: "लूप में उपयोग के लिए जे के मान की एक प्रति बनाएं, फिर लूप में कथन के माध्यम से जे की प्रतिलिपि के साथ जाएं, फिर वृद्धि ञ। "

कारण मुझे अनिश्चितता है क्योंकि मैंने लूप के लिए एक ऐसा बनाया है जो 10 से जे के मान को गुणा करता है और फिर जे = 1 के माध्यम से j = 1 के परिणाम को आउटपुट और पूर्व-वृद्धि दोनों का उपयोग करके आउटपुट करता है। मानव पठनीय आउटपुट पोस्ट-और पूर्व-वृद्धि के साथ बिल्कुल वही है। मैं सोच रहा हूं, 'आउटपुट बिल्कुल वही कैसे होते हैं यदि किसी प्रकार की कॉपी ऑपरेशन शामिल नहीं है?'

तो, मैं अनुमान लगा रहा हूं कि पूर्व और बाद में वृद्धि के बीच अंतर वास्तव में महत्वपूर्ण हो जाता है, php में, जब मैं संदर्भ मानों के नामों के बजाय संदर्भों का उपयोग करता हूं (जो php में पॉइंटर्स के रूप में कार्य करता है)? ऐसा इसलिए होगा क्योंकि संदर्भों की प्रतियां नहीं बनाई गई हैं, इसलिए पूर्व-वृद्धि होगी: "वृद्धि जे, फिर लूप में कथन के माध्यम से जे के बदले गए मूल्य के साथ जाएं, फिर फिर से वृद्धि करें ...," जबकि पोस्ट- incremetation इस तरह दिखेगा: "लूप में बयानों के लिए जे के मान का उपयोग करें, फिर जे के मान को बदलें, फिर जे के नए मूल्य के साथ लूप के माध्यम से जाओ ..."

+5

यह व्यवहार भाषा अज्ञेयवादी (या कम से कम, PHP के लिए विशिष्ट नहीं है) है, इसलिए यह वास्तव में एक डुप्लिकेट है [पुनरावृत्ति भाग में पोस्ट वृद्धि में पूर्व क्यों नहीं बदल रहा है लूप के लिए एक फर्क पड़ता है?] (http://stackoverflow.com/questions/1918196/why-doesnt-changing-the-pre-to-the-post-increment-at-the-iteration-part-of-a -for) –

+3

किस चिह्न के अलावा, यह प्रश्न बताता है कि आपके पास लूप वास्तव में क्या करता है, इसकी एक मूलभूत गलतफहमी है ... इसमें कोई प्रतिलिपि शामिल नहीं है - लूप के तीसरे खंड को अंत में निष्पादित किया जाता है लूप के शरीर का। आप वहां जो भी स्टेटमेनेट पसंद करते हैं उसे डाल सकते हैं और कोई विशेष प्रतिलिपि – tobyodavies

+1

नहीं होगी और कोई संदर्भ पॉइंटर्स के रूप में कार्य नहीं करता है। – netcoder

उत्तर

21

Pre- or post-incrementing चीजों को जादू में देरी न करें तब तक। यह बस इनलाइन शॉर्टेंड है।

enter image description here

// pre-increment 
$var = 5; 
print(++$var); // increments first, then passes value (now 6) to print() 

// post-increment 
$var = 5; 
print($var++); // passes value (still 5) to print(), then increments 

अब एक पाश को देखो।

for ($i = 0; $i < 9; $i++) { 
    print($i); 
} 

पाश घोषणा ($i++) के अंतिम भाग बस बयान पाश के माध्यम से एक समय के बाद निष्पादित करने के लिए है। यह कहीं भी मूल्य "पास" नहीं करता है, फिर इसे बढ़ाता है। उस समय कहीं भी $i का उपयोग नहीं किया जाता है। बाद में जब अगला कथन निष्पादित किया गया (print($i);), $i का मान पहले ही बढ़ चुका है।

// add 1, then do nothing with $i 
for ($i = 0; $i < 9; ++$i) {} 

// do nothing with $i, then add 1 
for ($i = 0; $i < 9; $i++) {} 

जिस तरीके से आप यह कर, $i पाश के भीतर ही किया जाएगा।


यदि यह मदद करता है, आप के रूप में छोटे दिनचर्या है कि एक तरह से यह करने के लिए उन्हें के बारे में सोच सकते हैं:

// ++$i 
{ 
    $i = $i + 1; 
    return $i; 
} 

// $i++ 
{ 
    return $i; 
    $i = $i + 1; 
} 

जैसा कि मैंने अपने प्रश्न पुन: पढ़ने, मुझे लगता है कि भ्रम की स्थिति कैसे के साथ और अधिक है लूप काम करता है कि ऑपरेटर कैसे काम करते हैं। ध्यान में रखते हुए कि वृद्धि एक सीधा है, सभी एक बार ऑपरेशन, यहां लूप में तीसरी अभिव्यक्ति कैसे काम करती है।

// here's a basic loop 
for ($i = 0; $i < 9; $i++) { 
    // do loop stuff 
    print($i); 
} 

// this is exactly what happens 
for ($i = 0; $i < 9;) { 
    // do loop stuff 
    print($i); 

    $i++; 
} 

सिर्फ इसलिए कि अंतिम पंक्ति पाश घोषणा में रखा जा सकता है कि यह किसी भी विशेष शक्तियां नहीं देता है। दृश्यों के पीछे कोई संदर्भ या कुछ भी उपयोग नहीं किया जाता है। उसी $i चर लूप के अंदर और बाहर दोनों को देखा जाता है। लूप के अंदर या बाहर प्रत्येक कथन सीधे आवश्यक होने पर $i के मान को देखता है। बस। कोई मजाकिया व्यवसाय नहीं।

+0

तो मूल रूप से ऐसा इसलिए है क्योंकि यह प्राप्त मूल्यों के बजाय वापसी मूल्यों के लिए है? –

+0

@Fohsap मुझे लगता है कि मैं आपका प्रश्न समझता हूं; मेरा अपडेट देखें – Wiseguy

+1

ग्रेट स्पष्टीकरण :) –

1

$x++ करते समय, आप बढ़ते हुए हैं ... इसका मतलब है कि वृद्धि का मूल्यांकन केवल कथन के मूल्यांकन के बाद ही होगा।

तो, निम्नलिखित कोड दिया:

$x = 10; $y = 0; $z = 5; 

$y = $z * $x++; 

पीएचपी करता है:

$x = 10; $y = 0; $z = 5; 

$y = $z * $x++; 

// Ignore Post-Increment, Evalutate 
$y = $z * $x; 
$y = 5 * 10; 

// Now Increment x - POST-INCREMENT 
$x = $x + 1; 
$x = 10 + 1; 
$x = 11; 

// Continue evaluating statement 
$y = 5 * 10; 
$y = 50; 

जब ++$x कर रही है, आप कर रहे हैं पूर्व incrementing ... इसका मतलब है कि incrementation से पहले हो जाएगा बयान मूल्यांकन किया जाता है:

$x = 10; $y = 0; $z = 5; 

$y = $z * ++$x; 

// Do Pre-Increment 
$x = $x + 1; 
$x = 10 + 1; 
$x = 11; 

// Evaluate 
$y = $z * $x; 
$y = 5 * 11; 
$y = 55; 

एक for के मामले में PHP में पाश, पीएचपी इस प्रकार पाश के लिए एक का मूल्यांकन करता है:

for($i = 0; $i < 30; $i++) { 
    doSomething(); 
} 

// Is evaluated EXACTLY as such by PHP 

$i = 0; 
while($i < 30) { 
    doSomething(); 

    $i++; 
} 

पहली अभिव्यक्ति ($i = 0) पाश की शुरुआत में मूल्यांकन किया जाता है (निष्पादित) एक बार बिना शर्त।

प्रत्येक पुनरावृत्ति की शुरुआत में, $i < 30 का मूल्यांकन किया जाता है। यदि यह सत्य का मूल्यांकन करता है, तो लूप जारी रहता है और नेस्टेड कथन निष्पादित होते हैं। यदि यह गलत मूल्यांकन करता है, तो लूप का निष्पादन समाप्त होता है।

प्रत्येक पुनरावृत्ति के अंत में, $i++ का मूल्यांकन एक स्वतंत्र अभिव्यक्ति के रूप में मूल्यांकन (निष्पादित) किया जाता है।

इसलिए, लूप में तीसरी अभिव्यक्ति के रूप में एक चर के बाद वृद्धि या पूर्व-वृद्धि को इसके व्यवहार पर कोई प्रभाव नहीं पड़ता है। इस साधारण मामले में, दोनों अभिव्यक्ति बिल्कुल वही व्यवहार करेंगे।

हालांकि, इस तरह के रूप में निम्नलिखित एक जटिल पाश में:

for($i = $j = 0; $i < 30; $i += ++$j) { 
    $j = getResult($j); 
} 

पोस्ट-incrementing या पूर्व incrementing $j सीधे ऊपर दिए गए उदाहरणों के अनुसार $i का मूल्य प्रभावित करता है। इस मामले में, आपको वही चुनना होगा जो आप करना चाहते हैं।

0
$i = 0; 
echo $i++; 
echo $i; 
$j=0; 
echo ++$j; 
echo $j; 

पूर्व वृद्धि प्रदर्शन वृद्धि मूल्य। लेकिन पोस्ट वृद्धि प्रदर्शन मूल्य वृद्धि तब वृद्धि। कोड के बारे में आउटपुट 01 और 11

+0

कृपया अधिक वर्णनात्मक बनें। –

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