2011-06-19 192 views
5

它們有何不同?這是我在想什麼,但我不知道....預增量與增量後

如果您使用預先增量,例如在for循環與++ j,那麼你基本上是說:「複製在循環中使用j的值,然後增加j,然後用j的副本遍歷循環中的語句。「如果你在同一個循環j ++中使用後增量,那麼你基本上是這麼說的:「複製循環中使用的j的值,然後用j的副本遍歷循環中的語句,然後增量J「。

我不確定的原因是因爲我創建了一個for循環,它將j的值乘以10,然後使用post-and pre-incrementation輸出j = 1到j = 12的結果。人類可讀的輸出與post-pre和pre-incrementation完全相同。我在想,'如果不涉及某種複製操作,輸出如何完全相同?'

所以,我猜測前後增量之間的區別真的變得很重要,在PHP中,當我使用引用(它用作php中的指針)而不是返回值的名稱?這是因爲沒有創建引用副本,所以預增量爲:「遞增j,然後通過j中已更改的值循環顯示語句,然後再次遞增j ......」增量將看起來像這樣:「使用循環中語句的j值,然後更改j的值,然後使用新的j值循環...」

+5

這種行爲是語言不可知的(或至少,不是特定於PHP),所以這實際上是一個重複的[爲什麼不改變前增量後迭代部分for循環有所作爲?](http://stackoverflow.com/questions/1918196/why-doesnt-changing-the-pre-to-the-post-increment-at-the-iteration-part-of-a -for) –

+3

除了標記說什麼以外,這個問題表明你對for循環實際上有一個相當基本的誤解......沒有任何複製 - for循環的第3個子句在最後執行的循環體。你可以把任何你喜歡的statmenet放在裏面,不會發生任何特殊的複製 – 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++; 

PHP做到這一點:

$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,你是預遞增......這意味着增量將之前發生聲明評估:

$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,PHP計算一個for循環如下:

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進行評估。如果它的計算結果爲TRUE,則循環繼續,並執行嵌套語句。如果它評估爲FALSE,則循環的執行結束。

在每次迭代結束時,$i++被評估(執行)爲獨立表達式。

因此,作爲循環中的第三個表達式進行遞增或預增量變量不會影響其行爲。在這種簡單情況下,兩個表達式的行爲將完全相同

然而,在複雜的循環如下列:

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

後遞增或預遞增$j直接影響根據上述實施例的的$i值。在這種情況下,您需要準確選擇您想要做的事情。

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

預先增加顯示遞增值。但後增量顯示值然後增加。關於代碼將輸出01和11

+0

請更具描述性。 –