Programing

PHP에서 ++ $ i와 $ i ++의 차이점은 무엇입니까?

crosscheck 2020. 10. 31. 09:21
반응형

PHP에서 ++ $ i와 $ i ++의 차이점은 무엇입니까?


차이 무엇 ++$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;

++$i 사전 증가입니다.

  1. $i 증가
  2. 새 값이 반환됩니다.

$i++ 증가 후

  1. $i내부 임시 변수 복사 된
  2. $i 증가
  3. 의 이전 값의 내부 사본 $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)
*/

이 예는 단순히 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

?>

차이점변수 ++$i를 증가 $i시키고 업데이트 된 값 $i++을 반환 하는 반면 원래 값을 반환하므로 증가시킵니다.

$prefix = 1;
$postfix = 1;
echo ++$prefix;   // 2
echo $postfix++;  // 1

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

post-fix 증분 연산자의 주요 목적은 다음과 같은 사용법입니다.

while(*condition*)
    $array[$i++] = $something;

이것은 배열 반복을 처리하는 매우 우아한 방법입니다. 고장:

  1. 변수 $ something이 $ i로 인덱싱 된 배열 요소에 할당됩니다.
  2. 변수 $ i가 증가합니다.
  3. 반복이 끝났고 조건 이 확인됩니다.

In all other cases, you should use the prefix operator. It makes the code much more clear (You can be sure, that you already work with the incremented value of particular variable).


It's probably best-illustrated by an example...

Post-increment:

$zero = 0;
$n = $zero++; //$n is zero

Pre-increment:

$zero = 0;
$n = ++$zero; //$n is one

Short answer:

  • Prefix increases the value and returns the value increased
  • Postfix increases the value and returns the value before it was increased
  • Prefix is faster

Long answer: If you think a little about it, how you would implement those yourself, you will probably realize why prefix is faster. Truth to be told, postfix is actually (often) implemented using prefix:

const T T::operator ++ (int) // postfix
    {
    T orig(*this);
    ++(*this); // call prefix operator
    return (orig);
    }

Avoid postfix unless you have a specific reason not to. The difference in speed can be quite a lot for complex datatypes.

I actually looked this up a few days ago. Heres my source.


I ran the following code to test if ++$i is 10% faster than $i++. I admit, the code does not have a stable outcome but even then I should at least have seen some numbers near the 10%. The highest I got was 4-4.5% approximately.

<?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++';

Both operators still do what their syntax implies: to increment. Regardless of prefix or postfix, the variable is sure to be incremented by 1. The difference between the two lies in their return values.

1. The prefix increment returns the value of a variable after it has been incremented.

2. On the other hand, the more commonly used postfix increment returns the value of a variable before it has been incremented.

// 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

To remember this rule, I think about the syntax of the two. When one types in the prefix increment, one says ++x. The position of the ++ is important here. Saying ++x means to increment (++) first then return the value of x, thus we have ++x. The postfix increment works conversely. Saying x++ means to return the value of x first then increment (++) it after, thus x++.

참고URL : https://stackoverflow.com/questions/1756015/whats-the-difference-between-i-and-i-in-php

반응형