Две версии оператора декремента в переполнении стека

Исследуя страницу PHP, я заметил следующий код:

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

Зачем ставить оператор декремента до переменная?

0

Решение

--$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, цикл это не должно иметь значение. Значение все еще уменьшается.

4

Другие решения

PHP поддерживает предварительный стиль C- и пост-операторы увеличения и уменьшения.

Примечание: операторы увеличения / уменьшения влияют только на числа и строки. Массивы, объекты и ресурсы не затрагиваются. Уменьшение номера
Значения 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: увеличение / уменьшение операторов

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

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 выполняется в конце цикла for.

5

они немного отличаются … и это вещь производительности; попробуй что-то вроде

<?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.";
0
По вопросам рекламы [email protected]