PHP 中递减运算符的两个版本
Two versions of decrement operator in PHP
在检查 PHP 页面时,我注意到以下代码:
for ($n=10; $n>0; --$n) {
//foo;
}
为什么要将减量运算符 放在变量 之前?
PHP 支持 C 风格的 pre-
和 post-
递增和递减运算符。
Note: The increment/decrement operators only affect numbers and strings. Arrays, objects and resources are not affected. Decrementing
NULL values has no effect too, but incrementing them results in 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
In your example, the very first iteration will have $n = 10
as the part --$n
is executed at the end of the for-loop.
--$x
和 $x--
是不同的运算符。它们都将变量减 1,但它们 return 不同。
--$x
:这会减少 $x
和 return 其 新的 值:
$y = --$x;
// Is equivalent to
// $x = $x-1;
// $y = $x;
$x--
:这会减少 $x
和 return 其 原始 值:
$y = $x--;
// Is equivalent to
// $y = $x;
// $x = $x - 1;
在 for
中,循环应该没有什么区别。该值仍在递减。
它们略有不同……这是性能问题;试试
<?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.";
在检查 PHP 页面时,我注意到以下代码:
for ($n=10; $n>0; --$n) {
//foo;
}
为什么要将减量运算符 放在变量 之前?
PHP 支持 C 风格的 pre-
和 post-
递增和递减运算符。
Note: The increment/decrement operators only affect numbers and strings. Arrays, objects and resources are not affected. Decrementing NULL values has no effect too, but incrementing them results in 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
In your example, the very first iteration will have
$n = 10
as the part--$n
is executed at the end of the for-loop.
--$x
和 $x--
是不同的运算符。它们都将变量减 1,但它们 return 不同。
--$x
:这会减少$x
和 return 其 新的 值:$y = --$x; // Is equivalent to // $x = $x-1; // $y = $x;
$x--
:这会减少$x
和 return 其 原始 值:$y = $x--; // Is equivalent to // $y = $x; // $x = $x - 1;
在 for
中,循环应该没有什么区别。该值仍在递减。
它们略有不同……这是性能问题;试试
<?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.";