차이 무엇 ++$i
과 $i++
PHP의는?
답변:
++$i
사전 증가이며 $i++
사후 증가입니다.
i
먼저 증가시킨 다음 참조를 해제합니다.i
"PHP가 사후 증가 ($ i ++) 및 사전 증가 (++ $ i)를 허용한다는 사실을 활용하십시오. $ j = $ i ++와 같은 것을 작성하지 않는 한 의미는 동일합니다. 사전 증가는 거의 10 % 더 빠릅니다. 즉, 기회가있을 때 사후 증가에서 사전 증가로 전환해야합니다. 특히 빡빡한 루프에서 특히 마이크로 최적화에 대해 현명한 경우에는 더욱 그렇습니다! " - TuxRadar
더 명확히하기 위해, PHP의 post-incrementation은이 10 % 오버 헤드와 pre-incrementation의 속성 인 임시 변수를 저장하는 것으로 문서화되었습니다.
++$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;
$a=func()++
과 같은 함수 호출로 바꾸어보십시오 . ++없이 func ()를 두 번 이상 호출하지 않고 어떻게 다시 작성할 수 있는지 자문 해보십시오.
++$i //first increment $i then run line
$i++ //first run line then increment $i
이 경우 차이가 없습니다.
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)
*/
그러나:
for($i = 0;$i<3; $j = ++$i )var_dump($j);
/*
NULL
int(1)
int(2)
*/
for($i = 0;$i<3; $j = $i++ )var_dump($j);
/*
NULL
int(0)
int(1)
*/
이 예는 단순히 elplains
<?php
$x = 10;
echo $x++. ' '.$x; // the result is 10 and 11
echo '<br>';
$y = 10;
echo ++$y. ' ' .$y; // the result is 11 and 11
// so the $x++ is not showing +1 at first but the next time
// and the ++y is showing +1 first time but not increasing next
아마도 예를 통해 가장 잘 설명 될 것입니다 ...
사후 증분 :
$zero = 0;
$n = $zero++; //$n is zero
사전 증가 :
$zero = 0;
$n = ++$zero; //$n is one
짧은 답변:
긴 대답 : 그것에 대해 조금 생각해 보면, 어떻게 직접 구현할 것인지, 접두사가 더 빠른 이유를 알게 될 것입니다 . 사실, postfix는 실제로 (종종) 접두사를 사용하여 구현 됩니다 .
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
특별한 이유가없는 한 접미사를 사용하지 마십시오. 복잡한 데이터 유형의 경우 속도 차이가 상당히 클 수 있습니다.
나는 실제로 며칠 전에 이것을 찾았습니다. 여기 내 소스입니다.
post-fix 증분 연산자의 주요 목적은 다음과 같은 사용법입니다.
while(*condition*)
$array[$i++] = $something;
이것은 배열 반복을 처리하는 매우 우아한 방법입니다. 고장:
다른 모든 경우에는 접두사 연산자를 사용해야합니다. 코드를 훨씬 더 명확하게 만듭니다 (특정 변수의 증가 된 값으로 이미 작업하고 있음을 확신 할 수 있습니다).
$ i ++는 post-increment로 알려져 있습니다. $ i의 원래 값을 $ j에 먼저 할당 한 후에 만 $ i의 값을 증가시킵니다.
++ $ 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
이러한 이론은 감소에도 유사한 방식으로 적용됩니다.
도움이 되었기를 바랍니다!
++ $ 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++';
두 연산자 모두 구문이 의미하는대로 증가합니다. 접두사 또는 접미사에 관계없이 변수는 반드시 1 씩 증가해야합니다. 두 변수의 차이는 반환 값에 있습니다.
1. 접두사 증분은 증분 된 변수의 값을 반환합니다.
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
이 규칙을 기억하기 위해 두 가지 구문에 대해 생각합니다. 접두사 증분을 입력하면 ++ x가 표시됩니다. 여기서 ++의 위치가 중요합니다. ++ x는 먼저 증가 (++) 한 다음 x의 값을 반환하는 것을 의미하므로 ++ x가 있습니다. 후위 증분은 반대로 작동합니다. x ++는 x의 값을 먼저 반환 한 다음 이후에 증가 (++)하므로 x ++를 의미합니다.