PHP में ++ $ i और $ i ++ के बीच क्या अंतर है?


जवाबों:


96

++$iपूर्व वेतन वृद्धि के $i++बाद वेतन वृद्धि है।

  • पूर्व-वृद्धि: वेतन वृद्धि चर i पहले और फिर डी-संदर्भ।
  • पोस्ट-इंक्रीमेंट: डी-रेफरेंस और उसके बाद इंक्रीमेंट i

"इस तथ्य का लाभ उठाएं कि PHP आपको पोस्ट-इन्क्रीमेंट ($ i ++) और प्री-इन्क्रीमेंट (++ $ i) की अनुमति देता है। अर्थ यह है कि जब तक आप $ j = $ i ++ जैसे कुछ भी नहीं लिख रहे हैं, तब तक पूर्व वेतन वृद्धि लगभग 10% तेज है, जिसका अर्थ है कि आपको पोस्ट से पूर्व-वेतन वृद्धि पर स्विच करना चाहिए, जब आपके पास अवसर होता है, खासकर तंग छोरों में और खासकर यदि आप माइक्रो-ऑप्टिमाइज़ेशन के बारे में पांडित्य हो! " - टक्सराडार

आगे स्पष्टीकरण के लिए, PHP में पोस्ट-इन्क्रीप्शन को एक अस्थायी चर के रूप में प्रलेखित किया गया है, जो इस 10% ओवरहेड बनाम प्री-इन्क्रीप्शन के लिए विशेषता है।


6
क्या यह अंगूठे का एक सामान्य नियम है, या क्या यह PHP विशिष्ट है।
Zoidberg

1
... स्रोत मेरे उत्तर में सूचीबद्ध है। मैंने इसे स्वयं नहीं देखा है ... मुझे लगता है कि मैं PHP के लिए स्रोत कोड को देखकर कर सकता हूं ...
jldupont

3
मैं खुद को किसी और भाषा के लिए सामान्य नहीं करूंगा।
१३:०४

3
प्री-इंक्रीप्शन की गति में वृद्धि इस तथ्य के कारण PHP विशिष्ट है कि पोस्ट-इंक्रीमेंट एक अस्थायी चर बनाता है, ओवरहेड बनाता है।
कोरी बल्लू

4
@knittl याद रखें कि यह बहुत जल्दी ऑपरेशन का 10% (एक उम्मीद है) :)
जेनसग्राम

68

++$iवेतन वृद्धि $i, लेकिन के मूल्य के मूल्यांकन करता है $i+1 $i++वेतन वृद्धि $i, लेकिन मूल्यांकन के पुराने मूल्य के लिए $i

यहाँ एक उदाहरण है:

$i = 10;
$a = $i++;
// Now $a is 10, and $i is 11

$i = 10;
$a = ++$i;
// Now $a is 11, and $i is 11

उपयोग करने के लिए कभी-कभी थोड़ी सुधार की लागत होती है $i++। देखें, जब आप कुछ ऐसा करते हैं

$a = $i++;

आप वास्तव में यह कर रहे हैं:

$temporary_variable = $i;
$i=$i+1;
$a=$temporary_variable;

4
यह बेहतर उत्तर है। बिना कोड के उदाहरणों के यह सामान्य सामान्यीकरण व्यर्थ है। इस तरह के जवाबों की संभावना उन लोगों से होने की संभावना है जो पहले से ही जानते हैं कि यह कैसे काम करता है और इस तरह उन्हें लगता है कि वे महान जवाब हैं।
जेम्स

मुझे यकीन है कि निचले स्तर पर इसके बारे में अधिक है, इसलिए यह प्रश्न मूट हो सकता है। लेकिन PHP को अस्थायी var की आवश्यकता क्यों होगी? क्यों नहीं: $ a = $ i; $ i = $ i + 1;
टेलर वेंस

@ टेलर, यह एक बड़ा सवाल है! $ I को इस तरह से फ़ंक्शन कॉल के साथ बदलने का प्रयास करें: $a=func()++और अपने आप से पूछें कि आप इसे ++ के बिना और फ़ेक (बिना कॉल किए) एक से अधिक बार कैसे लिख सकते हैं।
शालोम क्रेमर

43

++$i पूर्व-वृद्धि है

  1. $i बढ़ा हुआ है
  2. नया मान लौटाया गया है

$i++ वृद्धि के बाद है

  1. का मूल्य $iएक आंतरिक अस्थायी चर नकल
  2. $i बढ़ा हुआ है
  3. के पुराने मान की आंतरिक प्रतिलिपि $iवापस कर दी गई है


11

इस मामले में कोई अंतर नहीं है:

for($i = 0;$i<3;++$i)var_dump $i;
/*
int(0)
int(1)
int(2)
*/
for($i = 0;$i<3;$i++)var_dump $i;
/*
int(0)
int(1)
int(2)
*/

परंतु:

for($i = 0;$i<3; $j = ++$i )var_dump($j);
/*
NULL
int(1)
int(2)
*/
for($i = 0;$i<3; $j = $i++ )var_dump($j);
/*
NULL
int(0)
int(1)
*/

यह उपयोगी है, उपसर्ग वृद्धि में कम से कम आश्चर्य है। मैं अब हमेशा उपसर्ग वृद्धि का उपयोग करने के लिए स्विच करने जा रहा हूं।
CMCDragonkai

8

यह उदाहरण सरलता से बताता है

<?php 

$x = 10;  

echo $x++. ' '.$x;  // the result is 10 and 11

echo '<br>';

$y = 10;

echo ++$y. ' ' .$y; // the result is 11 and 11

// so the  $x++ is not showing +1 at first but the next time
// and the ++y is showing +1 first time but not increasing next

सरल उदाहरण के लिए धन्यवाद। मैं अब समझता हूँ।
प्रदीथा

7

अंतर है: ++$iवेतन वृद्धि $iचर और अद्यतन मूल्य लौटाएंगे, जबकि $i++मूल मूल्य लौटाएंगे, इसलिए इसे बढ़ाएँ।

$prefix = 1;
$postfix = 1;
echo ++$prefix;   // 2
echo $postfix++;  // 1

5

Jldupont की बात समझाने के लिए:

$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3

4

पूर्व और बाद के वेतन वृद्धि को देखने का एक और तरीका है कि यह 2 कथनों के संयोजन के लिए आशुलिपि है।

पूर्व incrementing

// long form
$y = $y + 1;
$x = $y; // any statement using $y

// shorthand
$x = ++$y; // the same statement using $y

पोस्ट-incrementing

// long form
$x = $y; // any statement using $y
$y = $y + 1;

// shorthand
$x = $y++; // the same statement using $y

3

यह शायद एक उदाहरण द्वारा सबसे अच्छी तरह से सचित्र है ...

पोस्ट-वेतन वृद्धि:

$zero = 0;
$n = $zero++; //$n is zero

पूर्व वेतन वृद्धि:

$zero = 0;
$n = ++$zero; //$n is one

3

संक्षिप्त जवाब:

  • उपसर्ग मूल्य को बढ़ाता है और मूल्य में वृद्धि लौटाता है
  • पोस्टफ़िक्स मूल्य बढ़ाता है और मूल्य बढ़ाए जाने से पहले वापस करता है
  • उपसर्ग तेज है

लंबे उत्तर: यदि आप इसके बारे में थोड़ा सोचते हैं, तो आप उन लोगों को कैसे लागू करेंगे, आपको शायद एहसास होगा कि उपसर्ग क्यों तेज है। कहा जाने वाला सत्य, उपसर्ग वास्तव में (अक्सर) उपसर्ग का उपयोग करके कार्यान्वित किया जाता है :

const T T::operator ++ (int) // postfix
    {
    T orig(*this);
    ++(*this); // call prefix operator
    return (orig);
    }

जब तक आपके पास कोई विशिष्ट कारण न हो, पोस्टफ़िक्स से बचें। जटिल डेटाटाइप्स के लिए गति में अंतर काफी हो सकता है।

मैंने वास्तव में कुछ दिन पहले इसे देखा था। मेरे स्रोत का उपयोग करें।


3

फिक्स फिक्स इन्क्रीमेंट ऑपरेटर का मुख्य उद्देश्य इस तरह का उपयोग है:

while(*condition*)
    $array[$i++] = $something;

यह एक बहुत ही सुंदर तरीका है, कैसे कुछ सरणी पुनरावृत्तियों के आसपास पाने के लिए। टूट - फूट:

  1. परिवर्तनीय $ कुछ को $ i के साथ अनुक्रमित सरणी तत्व को सौंपा जाएगा
  2. परिवर्तनीय $ i को बढ़ाया जाएगा
  3. Iteration अंत में है, स्थिति की जाँच की जाएगी

अन्य सभी मामलों में, आपको उपसर्ग ऑपरेटर का उपयोग करना चाहिए। यह कोड को और अधिक स्पष्ट करता है (आप सुनिश्चित हो सकते हैं, कि आप पहले से ही विशेष चर के बढ़े हुए मूल्य के साथ काम करते हैं)।


उपसर्ग का उपयोग करने की सिफारिश करने के लिए उत्कीर्ण जब तक कि एक उपसर्ग को कड़ाई से आवश्यक नहीं है।
developerbmw

3

$ i ++ को पोस्ट-इन्क्रीमेंट के रूप में जाना जाता है। यह $ i के मूल मूल्य को पहले $ i से $ j में निर्दिष्ट करने के बाद ही बढ़ाता है।

++ $ i को प्री-इन्क्रीमेंट के रूप में जाना जाता है। यह $ j का मान निर्दिष्ट करने से पहले $ i का मूल्य बढ़ाता है, इसलिए $ i का अद्यतन मूल्य $ j को सौंपा जाएगा।

इसलिये,

$i = 4;
$j = $i++;
// Now, $i = 5 and $j = 4

$i = 4;
$j = ++$i;
// Now, $i = 5 and $j = 5

ये सिद्धांत एक समान तरीके से घटने के लिए भी लागू होते हैं।

उम्मीद है की यह मदद करेगा!


0

मैं परीक्षण के लिए निम्न कोड भागा अगर ++ $ i $ $ i ++ से तेज है। मैं मानता हूं, कोड का स्थिर परिणाम नहीं है, लेकिन फिर भी मुझे कम से कम 10% के करीब कुछ संख्याएं देखनी चाहिए। मुझे जो उच्चतम मिला वह 4-4.5% था।

<?php

$randomFloat = rand(0, 10) / 10;

$before1 = microtime(true);

for($i=0; $i <1000000; ++$i){
    $rand = (rand(0, 10) / 10) * (rand(0, 10) / 10);
}

$after1 = microtime(true);
echo 'it took '.($after1-$before1) . ' seconds fot ++$i<br />';

$before2 = microtime(true);

for($i=0; $i <1000000; $i++){
    $rand = (rand(0, 10) / 10) * (rand(0, 10) / 10);
}

$after2 = microtime(true);
echo 'it took '.($after2-$before2) . ' seconds fot $i++<br /><br />';

echo '++$i is '.((($after1-$before1)*100)/($after2-$before2)-100).'% faster than $i++';

-1

दोनों ऑपरेटर अभी भी वही करते हैं जो उनका सिंटैक्स होता है: वेतन वृद्धि के लिए। उपसर्ग या उपसर्ग के बावजूद, परिवर्तनशील को 1. वृद्धि द्वारा निश्चित किया जाता है। दोनों के बीच का अंतर उनके रिटर्न मानों में होता है।

1। उपसर्ग वृद्धिशील चर के मान को वापस कर दिया जाता है जब इसे बढ़ाया गया है।

2. दूसरी ओर, आमतौर पर उपयोग किए जाने वाले पोस्टफिक्स इन्क्रीमेंट से पहले एक वेरिएबल का मान बढ़ जाता है।

// Prefix increment

let prefix = 1;
console.log(++prefix); // 2

console.log(prefix); // 2

// Postfix increment

let postfix = 1;

console.log(postfix++); // 1

console.log(postfix); // 2

इस नियम को याद रखने के लिए , मैं दो के वाक्य विन्यास के बारे में सोचता हूँ। जब उपसर्ग वृद्धि में एक प्रकार, कोई कहता है ++ x। ++ की स्थिति यहां महत्वपूर्ण है। ++ x कहने का अर्थ है कि वेतन वृद्धि (++) पहले x का मान लौटाएं, इस प्रकार हमारे पास ++ x है। पोस्टफ़िक्स इन्क्रीमेंट इसके विपरीत काम करता है। X ++ कहने का मतलब है कि पहले x का मान लौटाओ फिर उसके बाद वृद्धि (++) करो, इस प्रकार x ++।

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