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


답변:


96

++$i사전 증가이며 $i++사후 증가입니다.

  • 사전 증가 : 변수를 i먼저 증가시킨 다음 참조를 해제합니다.
  • 사후 증가 : 역 참조 후 증가 i

"PHP가 사후 증가 ($ i ++) 및 사전 증가 (++ $ i)를 허용한다는 사실을 활용하십시오. $ j = $ i ++와 같은 것을 작성하지 않는 한 의미는 동일합니다. 사전 증가는 거의 10 % 더 빠릅니다. 즉, 기회가있을 때 사후 증가에서 사전 증가로 전환해야합니다. 특히 빡빡한 루프에서 특히 마이크로 최적화에 대해 현명한 경우에는 더욱 그렇습니다! " - TuxRadar

더 명확히하기 위해, PHP의 post-incrementation은이 10 % 오버 헤드와 pre-incrementation의 속성 인 임시 변수를 저장하는 것으로 문서화되었습니다.


6
이것은 일반적인 경험 법칙입니까, 아니면 PHP 전용입니까?
Zoidberg

1
... 내 대답에 출처가 나와 있습니다. 나는 ... 나는 PHP 소스 코드 그래도보고 내가 할 수있는 것 같아요 ... 나 자신에서 그것을 확인하지 않은
jldupont

3
나는 다른 언어로 일반화하지 않을 것입니다.
jldupont 09

3
사전 증가의 속도 증가는 사후 증가가 임시 변수를 생성하여 오버 헤드를 생성하기 때문에 PHP에 따라 다릅니다.
Corey Ballou

4
@knittl 매우 빠른 작업 의 10 %라는 것을 기억하십시오. :)
jensgram

66

++$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;

3
이것이 더 나은 대답입니다. 이것이 코드 예제없이하는 일의 일반화는 의미가 없습니다. 이러한 답변에 대한 찬성 투표는 이미 작동 방식을 알고 있으므로 훌륭한 답변이라고 생각하는 사람들의 가능성이 높습니다.
James

나는 더 낮은 수준에서 더 많은 것이 있다고 확신 하므로이 질문은 논쟁의 여지가있을 수 있습니다. 하지만 PHP는 왜 임시 변수를 필요로합니까? 왜 안 되는가 : $ a = $ i; $ i = $ i + 1;
Taylor Vance

@Taylor, 좋은 질문입니다! $ i를 다음 $a=func()++과 같은 함수 호출로 바꾸어보십시오 . ++없이 func ()를 두 번 이상 호출하지 않고 어떻게 다시 작성할 수 있는지 자문 해보십시오.
Shalom Craimer

43

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

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

$i++ 증가 후

  1. $i내부 임시 변수 에 복사 된 값
  2. $i 증가
  3. 의 이전 값의 내부 사본 $i이 리턴됩니다.

14
++$i //first increment $i then run line
$i++ //first run line then increment $i 

기술적으로 지나치게 단순화 한 것입니다. for 루프 등을 생각해보십시오.
Antony Carthy

11

이 경우 차이가 없습니다.

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

이것은 유용합니다. 접두사 증분은 가장 덜 놀라운 것 같습니다. 이제 항상 접두사 증분을 사용하도록 전환하겠습니다.
CMCDragonkai 2015-06-26

8

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

간단한 예에 감사드립니다. 지금은 이해.
Praditha

7

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

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

5

jldupont의 요점을 설명하려면 :

$i = 1;
$x = $i++;
echo $x; // prints 1
$x = ++$i;
echo $x; // prints 3

4

사전 및 사후 증분을 보는 또 다른 방법은 두 개의 문을 결합하는 속기입니다.

사전 증가

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

3

아마도 예를 통해 가장 잘 설명 될 것입니다 ...

사후 증분 :

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

사전 증가 :

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

3

짧은 답변:

  • 접두사는 값을 증가시키고 증가 된 값을 반환합니다.
  • Postfix는 값을 증가시키고 증가되기 전의 값을 반환합니다.
  • 접두사가 더 빠름

긴 대답 : 그것에 대해 조금 생각해 보면, 어떻게 직접 구현할 것인지, 접두사가 더 빠른 이유를 알게 될 것입니다 . 사실, postfix는 실제로 (종종) 접두사를 사용하여 구현 됩니다 .

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

특별한 이유가없는 한 접미사를 사용하지 마십시오. 복잡한 데이터 유형의 경우 속도 차이가 상당히 클 수 있습니다.

나는 실제로 며칠 전에 이것을 찾았습니다. 여기 내 소스입니다.


3

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

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

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

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

다른 모든 경우에는 접두사 연산자를 사용해야합니다. 코드를 훨씬 더 명확하게 만듭니다 (특정 변수의 증가 된 값으로 이미 작업하고 있음을 확신 할 수 있습니다).


접미사가 꼭 필요한 경우가 아니면 접두사 사용을 권장하도록 찬성했습니다.
developerbmw

3

$ 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

이러한 이론은 감소에도 유사한 방식으로 적용됩니다.

도움이 되었기를 바랍니다!


0

++ $ 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 씩 증가해야합니다. 두 변수의 차이는 반환 값에 있습니다.

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 ++를 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.