PHP में ++$i
और क्या अंतर है $i++
?
जवाबों:
++$i
पूर्व वेतन वृद्धि के $i++
बाद वेतन वृद्धि है।
i
पहले और फिर डी-संदर्भ।i
"इस तथ्य का लाभ उठाएं कि PHP आपको पोस्ट-इन्क्रीमेंट ($ i ++) और प्री-इन्क्रीमेंट (++ $ i) की अनुमति देता है। अर्थ यह है कि जब तक आप $ j = $ i ++ जैसे कुछ भी नहीं लिख रहे हैं, तब तक पूर्व वेतन वृद्धि लगभग 10% तेज है, जिसका अर्थ है कि आपको पोस्ट से पूर्व-वेतन वृद्धि पर स्विच करना चाहिए, जब आपके पास अवसर होता है, खासकर तंग छोरों में और खासकर यदि आप माइक्रो-ऑप्टिमाइज़ेशन के बारे में पांडित्य हो! " - टक्सराडार
आगे स्पष्टीकरण के लिए, PHP में पोस्ट-इन्क्रीप्शन को एक अस्थायी चर के रूप में प्रलेखित किया गया है, जो इस 10% ओवरहेड बनाम प्री-इन्क्रीप्शन के लिए विशेषता है।
++$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;
$a=func()++
और अपने आप से पूछें कि आप इसे ++ के बिना और फ़ेक (बिना कॉल किए) एक से अधिक बार कैसे लिख सकते हैं।
++$i //first increment $i then run line
$i++ //first run line then increment $i
इस मामले में कोई अंतर नहीं है:
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)
*/
यह उदाहरण सरलता से बताता है
<?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
अंतर है: ++$i
वेतन वृद्धि $i
चर और अद्यतन मूल्य लौटाएंगे, जबकि $i++
मूल मूल्य लौटाएंगे, इसलिए इसे बढ़ाएँ।
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
पूर्व और बाद के वेतन वृद्धि को देखने का एक और तरीका है कि यह 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
यह शायद एक उदाहरण द्वारा सबसे अच्छी तरह से सचित्र है ...
पोस्ट-वेतन वृद्धि:
$zero = 0;
$n = $zero++; //$n is zero
पूर्व वेतन वृद्धि:
$zero = 0;
$n = ++$zero; //$n is one
संक्षिप्त जवाब:
लंबे उत्तर: यदि आप इसके बारे में थोड़ा सोचते हैं, तो आप उन लोगों को कैसे लागू करेंगे, आपको शायद एहसास होगा कि उपसर्ग क्यों तेज है। कहा जाने वाला सत्य, उपसर्ग वास्तव में (अक्सर) उपसर्ग का उपयोग करके कार्यान्वित किया जाता है :
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
जब तक आपके पास कोई विशिष्ट कारण न हो, पोस्टफ़िक्स से बचें। जटिल डेटाटाइप्स के लिए गति में अंतर काफी हो सकता है।
मैंने वास्तव में कुछ दिन पहले इसे देखा था। मेरे स्रोत का उपयोग करें।
फिक्स फिक्स इन्क्रीमेंट ऑपरेटर का मुख्य उद्देश्य इस तरह का उपयोग है:
while(*condition*)
$array[$i++] = $something;
यह एक बहुत ही सुंदर तरीका है, कैसे कुछ सरणी पुनरावृत्तियों के आसपास पाने के लिए। टूट - फूट:
अन्य सभी मामलों में, आपको उपसर्ग ऑपरेटर का उपयोग करना चाहिए। यह कोड को और अधिक स्पष्ट करता है (आप सुनिश्चित हो सकते हैं, कि आप पहले से ही विशेष चर के बढ़े हुए मूल्य के साथ काम करते हैं)।
$ 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
ये सिद्धांत एक समान तरीके से घटने के लिए भी लागू होते हैं।
उम्मीद है की यह मदद करेगा!
मैं परीक्षण के लिए निम्न कोड भागा अगर ++ $ 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। उपसर्ग वृद्धिशील चर के मान को वापस कर दिया जाता है जब इसे बढ़ाया गया है।
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 ++।