PHP에서 ++$i와 $i++의 차이점은 무엇입니까?
와의 차이는 무엇입니까?++$i
그리고.$i++
PHP로요?
++$i
이 경우 사전 검증됩니다.$i++
사후 처리
- pre-pariable: 증분 변수
i
먼저 참조 해제하고 나서 참조 해제. - 사후 참조: 참조 해제 후 증가
i
"PHP를 통해 포스트 인크리먼트($i+)와 프리 인크리먼트(+$i)를 할 수 있다는 사실을 활용하십시오.이 의미는 $j = $i++와 같은 내용을 쓰지 않는 한, 사전 준비는 거의 10% 더 빠릅니다. 즉, 기회가 있을 때 포스트 준비에서 사전 준비로 전환해야 합니다. 특히 꽉 막힌 루프에서 특히 마이크로 최적화에 대해 전문적으로 알고 있다면 더욱 그렇습니다!" - TuxRadar
자세한 설명을 위해 PHP의 사후 증가에는 이러한 10%의 오버헤드와 사전 증가의 원인이 되는 임시 변수가 저장되어 있는 것으로 문서화되어 있습니다.
++$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;
++$i
프리 인크리멘테이션
$i
증가하다- 새 값이 반환됩니다.
$i++
인크리멘테이션 후
- 의 가치
$i
내부 임시 변수에 복사 $i
증가하다- 오래된 가치의 내부 복사
$i
반환되다
++$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)
*/
이 예는 간단히 설명된다
<?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
차이점은 다음과 같습니다.++$i
증가하다$i
variable 및 return updated value, 반면$i++
원래 값이 반환되므로 값을 늘립니다.
$prefix = 1;
$postfix = 1;
echo ++$prefix; // 2
echo $postfix++; // 1
$i++는 post-filename으로 알려져 있습니다.원래 값 $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
이러한 이론은 감소에도 비슷한 방식으로 적용된다.
이게 도움이 됐으면 좋겠네요!
jldupont의 요점을 설명하려면:
$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3
사전 및 사후 증가를 보는 또 다른 방법은 두 문장을 결합하는 약자입니다.
프리 인크리먼트
// 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
아마 예시로 가장 잘 설명할 수 있을 거야
증가 후:
$zero = 0;
$n = $zero++; //$n is zero
증가 전:
$zero = 0;
$n = ++$zero; //$n is one
간단한 답변:
- Prefix를 지정하면 값이 증가하고 값이 증가합니다.
- Postfix는 값을 증가시키고 증가하기 전의 값을 반환합니다.
- 프리픽스가 더 빠릅니다.
장황한 답변:이러한 기능을 직접 실장하는 방법을 조금만 생각해 보면 프레픽스가 빠른 이유를 알 수 있을 것입니다.사실 포스트픽스는 실제로 (대부분) 프레픽스를 사용하여 구현됩니다.
const T T::operator ++ (int) // postfix
{
T orig(*this);
++(*this); // call prefix operator
return (orig);
}
특별한 이유가 없는 한 포스트픽스를 피합니다.복잡한 데이터 유형의 경우 속도 차이가 상당히 클 수 있습니다.
사실 며칠 전에 이걸 찾아봤어요.내 정보원이야
post-fix increment 연산자의 주요 목적은 다음과 같은 사용입니다.
while(*condition*)
$array[$i++] = $something;
이것은 어레이 반복을 회피하는 매우 우아한 방법입니다.내역:
- $i로 인덱싱된 어레이 요소에 $something 변수가 할당됩니다.
- 변수 $i가 증가합니다.
- 반복이 종료되면 조건이 확인됩니다.
그 외의 경우 모두 prefix 연산자를 사용해야 합니다.이것에 의해, 코드가 한층 더 명확해집니다(특정 변수의 증분치를 이미 사용하고 있는 것을 확인할 수 있습니다).
다음 코드를 실행하여 ++$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++로 하는 것을 의미합니다.
언급URL : https://stackoverflow.com/questions/1756015/whats-the-difference-between-i-and-i-in-php
'programing' 카테고리의 다른 글
롬복의 슈퍼 컨스트럭터에 전화하는 방법 (0) | 2022.11.01 |
---|---|
스트림에서 Collections.toMap()을 사용할 때 목록의 반복 순서를 유지하려면 어떻게 해야 합니까? (0) | 2022.11.01 |
war/WEB-INF 폴더의 리소스에 대한 파일 경로 (0) | 2022.11.01 |
세트를 어레이로 변환하는 방법 (0) | 2022.11.01 |
내장된 가우스 기능을 사용하지 않고 이미지를 흐리게 하는 방법은 무엇입니까? (0) | 2022.10.30 |