什么';这是++$i和$i++;在PHP中?
PHP中的什么';这是++$i和$i++;在PHP中?,php,operators,Php,Operators,PHP中的++$i和$i++有什么区别?++$i是增量前的,而$i++是增量后的 预增量:先增量变量i,然后取消引用 增量后:取消引用,然后增量i “利用PHP 允许您发布增量($i++) 和前置增量(+++$i)。其含义 只要你不是,一切都一样 编写类似$j=$i++, 然而,预增量几乎为10% 更快,这意味着你应该 从后增量切换到预增量 当你有机会的时候, 尤其是在紧环和 尤其是如果你对这件事很迂腐的话 微观优化!” - 为了进一步澄清,PHP中的增量后存储被记录为存储一个临时变量,与增
++$i
和$i++
有什么区别?++$i
是增量前的,而$i++
是增量后的
- 预增量:先增量变量
,然后取消引用i
- 增量后:取消引用,然后增量
i
为了进一步澄清,PHP中的增量后存储被记录为存储一个临时变量,与增量前相比,该临时变量的开销为10%。为了解释杜邦的观点:
++$i //first increment $i then run line
$i++ //first run line then increment $i
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
区别在于:++$i
将递增$i
变量并返回更新后的值,而$i++
将返回原始值,因此将其递增
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
这可能最好用一个例子来说明 增量后:
$zero = 0;
$n = $zero++; //$n is zero
$zero = 0;
$n = ++$zero; //$n is one
增量前:
$zero = 0;
$n = $zero++; //$n is zero
$zero = 0;
$n = ++$zero; //$n is one
+$i
是预增量
$i
递增$i++
是后期增量
$i
的值复制到内部临时变量$i
递增$i
旧值的内部副本+$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;
简短回答:
$zero = 0;
$n = $zero++; //$n is zero
$zero = 0;
$n = ++$zero; //$n is one
- 前缀增加值并返回增加的值
- 后缀增加值并返回增加前的值
- 前缀更快
事实上我几天前查过这个 另一种看待递增前后的方法是,它是组合两个语句的简写 预递增
// long form
$y = $y + 1;
$x = $y; // any statement using $y
// shorthand
$x = ++$y; // the same statement using $y
// long form
$x = $y; // any statement using $y
$y = $y + 1;
// shorthand
$x = $y++; // the same statement using $y
后增量
// long form
$y = $y + 1;
$x = $y; // any statement using $y
// shorthand
$x = ++$y; // the same statement using $y
// long form
$x = $y; // any statement using $y
$y = $y + 1;
// shorthand
$x = $y++; // the same statement using $y
在这种情况下,没有区别:
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)
*/
对于($i=0;$i我运行了以下代码来测试+++$i是否比$i++快10%。我承认,代码没有稳定的结果,但即使如此,我至少应该看到一些接近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++';
后修复增量运算符的主要用途如下:
while(*condition*)
$array[$i++] = $something;
这是一个非常优雅的方法,如何绕过一些数组迭代。
细分:
变量$something将分配给使用$i索引的数组元素
变量$i将递增
迭代结束时,将检查条件
在所有其他情况下,您都应该使用前缀运算符。它使代码更加清晰(您可以确定,您已经使用了特定变量的递增值)。此示例非常简单
这两个运算符仍按其语法含义执行:递增。无论前缀或后缀如何,变量都会递增1。两者之间的差异在于返回值。
1。前缀increment返回变量递增后的值
// 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
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
为了记住这条规则,我考虑了这两条规则的语法。当一个人键入前缀increment时,他会说++x。这里++的位置很重要。说++x意味着increment(++)首先返回x的值,因此我们有++x。后缀增量的作用相反。说x++意味着先返回x的值,然后再递增(++)它,因此x++。
++$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
这些理论同样适用于递减
希望这能有所帮助!这是一个一般的经验法则,还是特定于PHP的…源代码列在我的答案中。我自己还没有检查过它…我想我可以通过查看PHP的源代码…我自己不会推广到其他语言。预增量的速度增加是特定于PHP的,因为post-增量创建了一个临时变量,产生了开销。@knittl请记住,这是一个(希望是)非常快速的操作的10%:)从技术上讲,这是一个过于简单化的操作——想想for循环等。这很有用,前缀增量似乎没有什么意外。我现在将切换到始终使用前缀增量。投票赞成建议使用前缀,除非严格需要后缀。感谢简单的示例。我现在明白了。这是更好的答案。在没有代码示例的情况下对其进行一般性概括是毫无意义的。对这些答案的投票很可能来自