2015-09-28 2 views
-1

В рассмотрении PHP страницы, я заметил следующий код:Две версии декремента оператора в PHP

for ($n=10; $n>0; --$n) { 
    //foo; 
} 

Почему бы один поставить оператор декремента перед тем переменной?

+2

потому что _prefix_ операторов. – user5173426

+9

Возможный дубликат [Ссылка - что означает этот символ в PHP?] (Http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) –

ответ

4

--$x и $x-- - это разные операторы. Они оба уменьшают переменную на 1, но они возвращают разные вещи.

  • --$x: Это уменьшает $x и возвращает его новое значения:

    $y = --$x; 
    // Is equivalent to 
    // $x = $x-1; 
    // $y = $x; 
    
  • $x--: Это уменьшает $x и возвращает его оригинального значения:

    $y = $x--; 
    // Is equivalent to 
    // $y = $x; 
    // $x = $x - 1; 
    

В петле for это не должно иметь значения. Значение все еще уменьшается.

+0

спасибо за это! Я этого раньше не видел. –

+0

Добро пожаловать :-) –

5

PHP поддерживает C-стиль pre - и отправляет - операторы приращения и декрементации.

Примечание: Операторы приращения/уменьшения влияют только на числа и строки. Массивы, объекты и ресурсы не затрагиваются. Уменьшение номера NULL значения не имеет никакого эффекта тоже, но приращение их результаты в 1.

++$a Pre-increment Increments $a by one, then returns $a. 
$a++ Post-increment Returns $a, then increments $a by one. 
--$a Pre-decrement Decrements $a by one, then returns $a. 
$a-- Post-decrement Returns $a, then decrements $a by one. 

примера:

<?php 
echo "<h3>Postincrement</h3>"; 
$a = 5; 
echo "Should be 5: " . $a++ . "<br />\n"; 
echo "Should be 6: " . $a . "<br />\n"; 

echo "<h3>Preincrement</h3>"; 
$a = 5; 
echo "Should be 6: " . ++$a . "<br />\n"; 
echo "Should be 6: " . $a . "<br />\n"; 

echo "<h3>Postdecrement</h3>"; 
$a = 5; 
echo "Should be 5: " . $a-- . "<br />\n"; 
echo "Should be 4: " . $a . "<br />\n"; 

echo "<h3>Predecrement</h3>"; 
$a = 5; 
echo "Should be 4: " . --$a . "<br />\n"; 
echo "Should be 4: " . $a . "<br />\n"; 
?> 

PHP Manual: Incrementing/Decrementing Operators

РЕДАКТИРОВАТЬ:

for ($n=10; $n>0; --$n) { 
    echo "Iterating:" . $n . "<br>"; 
} 

ВЫХОД:

Iterating:10 
Iterating:9 
Iterating:8 
Iterating:7 
Iterating:6 
Iterating:5 
Iterating:4 
Iterating:3 
Iterating:2 
Iterating:1 

В вашем примере, первый итерации будут иметь $n = 10 как часть --$n выполняется в конце для цикла.

+2

N.B.Он все равно начнется с $ n = 10, потому что третья часть элементов цикла цикла (декремент) выполняется в конце цикла –

+0

@MarkBaker Ahh, craps. позвольте мне исправить это. – user5173426

+1

Hats-Off @HawasKaPujaari. У вас много терпения. –

0

они немного разные ... и его производительность; попробуйте что-то вроде

<?php 
for($i=0;$i<100000000;++$i){ 
    //heating up the cpu (if it uses some power saving feature or whatever) 
} 
$i=0; 
$PreIncrementStart=microtime(true); 
for($i=0;$i<100000000;++$i){ 
    //counting to 100 million, using pre-increment. 
} 
$PreIncrementEnd=microtime(true); 
$i=0; 
$PostIncrementStart=microtime(true); 
for($i=0;$i<100000000;$i++){ 
    //counting to 100 million, using post-increment. 
} 
$PostIncrementEnd=microtime(true); 
$PreTime=$PreIncrementEnd-$PreIncrementStart; 
$PostTime=$PostIncrementEnd-$PostIncrementStart; 
if($PreTime<$PostTime){ 
    echo "the fastest was pre-increment. (which totally makes sense, it's consistent with c/c++, and it uses fewer opcodes than the post-increment, and the `old` value is not returned, only the new value, so we don't need 2 values (old value AND new value, as the post-increment does)..)"; 
} else { 
    echo "the fastest was post-increment... i am very surprised."; 
} 
echo "the difference was: ".abs($PreTime-$PostTime)." seconds."; 
Смежные вопросы