PHP / 연산자 / 증가 연산자, 감소 연산자
PHP의 ++는 숫자 변수의 값을 1 늘리고, --는 1 줄입니다. 변수 앞에 쓰면 변경된 값을 식의 결과로 사용하고, 뒤에 쓰면 변경 전 값을 식의 결과로 사용합니다. 어느 쪽이든 문장이 끝난 뒤 변수에는 변경된 값이 남습니다.
전위·후위 연산자의 반환값 비교
전위는 연산자를 변수 앞에, 후위는 변수 뒤에 쓰는 표기입니다. 아래 표는 매번 $n을 정수 5로 초기화했을 때의 결과입니다. 한 행의 결과를 다음 행의 시작값으로 이어서 계산한 표가 아닙니다.
| 표기 | 종류 | 식의 결과 | 연산 뒤 $n |
|---|---|---|---|
| ++$n | 전위 증가 | 6 | 6 |
| $n++ | 후위 증가 | 5 | 6 |
| --$n | 전위 감소 | 4 | 4 |
| $n-- | 후위 감소 | 5 | 4 |
PHP가 설치된 환경에서 다음 전체 코드를 increment.php로 저장한 뒤 php increment.php로 실행하면 반환값과 변수의 최종값을 함께 확인할 수 있습니다. 뒤의 예제들도 별도 PHP 파일로 저장해 같은 방식으로 실행합니다.
<?php
$n = 5;
$result = ++$n;
echo "pre increment: result=$result, n=$n", PHP_EOL;
$n = 5;
$result = $n++;
echo "post increment: result=$result, n=$n", PHP_EOL;
$n = 5;
$result = --$n;
echo "pre decrement: result=$result, n=$n", PHP_EOL;
$n = 5;
$result = $n--;
echo "post decrement: result=$result, n=$n", PHP_EOL;
출력의 result와 n은 표의 마지막 두 열과 같습니다. $result = $n++에서는 $result에 5가 저장되지만 $n은 6이 됩니다. 반면 $result = ++$n에서는 두 변수 모두 6입니다. 기본 동작은 PHP 증가·감소 연산자 문서와 같습니다.
반복문에서는 갱신 시점과 종료 조건 확인
for 문의 세 번째 칸은 본문이 한 번 실행된 뒤에 평가됩니다. 여기에서 증가식의 반환값을 따로 사용하지 않으면 $i++와 ++$i는 같은 숫자 순서로 반복합니다. 전위·후위의 차이와 반복문이 갱신식을 실행하는 시점을 구분해야 합니다.
<?php
for ($i = 0; $i < 3; $i++) {
echo $i, PHP_EOL;
}
echo "after loop: $i", PHP_EOL;
for ($remaining = 3; $remaining > 0; --$remaining) {
echo "remaining: $remaining", PHP_EOL;
}
첫 반복문은 0, 1, 2를 한 줄씩 출력한 뒤 after loop: 3을 출력합니다. $i가 3으로 증가한 뒤 다음 조건 검사에서 거짓이 되어 종료됩니다. 두 번째 반복문은 remaining: 3, 2, 1을 출력하고 0에서는 본문을 실행하지 않습니다.
첫 반복문의 $i++만 ++$i로 바꾸어도 출력은 같습니다. 원래 값으로 되돌려 비교하면 전위·후위의 반환값이 여기에서는 쓰이지 않는다는 점을 확인할 수 있습니다. 감소 반복문에서 실수로 증가시키면 종료 조건에서 멀어질 수 있으므로, 시작값·조건·증감 방향을 함께 점검하세요. 구문별 실행 시점은 PHP for 문서에서 설명합니다.
한 식에서 같은 변수를 여러 번 변경하지 않기
$n + $n++처럼 같은 변수를 읽으면서 변경하는 식은 읽기 어렵고 평가 순서에 의존할 수 있습니다. 연산자 우선순위가 식을 묶는 방법을 정한다고 해서 모든 피연산자의 평가 순서까지 정해 주지는 않습니다. 필요한 이전 값과 새 값을 별도 문장으로 나누면 의도가 분명해집니다.
<?php
$n = 5;
$before = $n;
$n++;
$sum = $before + $n;
echo "sum=$sum, n=$n", PHP_EOL;
$count = 0;
$count += 2;
echo "count=$count", PHP_EOL;
위 예제는 sum=11, n=6과 count=2를 출력합니다. $before에 변경 전 값을 보관하고 나서 $n을 증가시켰기 때문에 합계가 어떻게 만들어졌는지 추적하기 쉽습니다. 2 이상 늘리려는 목적이라면 ++를 반복하기보다 +=처럼 변화량을 명시할 수 있습니다.
전위·후위를 무조건 성능 기준으로 고르기보다 반환값이 필요한지와 읽기 쉬운지를 먼저 판단하세요. 복잡한 식은 PHP 우선순위와 평가 순서 설명을 참고해 문장으로 분리하는 편이 안전합니다.
문자열에는 숫자 증감 규칙을 그대로 적용하지 않기
문자열 변수를 일반 카운터처럼 다루지 않는 편이 좋습니다. 비숫자 문자열에 ++를 쓰는 기존 기능은 PHP 8.3부터 사용을 피하도록 안내되며, PHP 8.5부터는 해당 증가에 폐기 예정 경고도 발생합니다. 영문·숫자로 된 문자열의 다음 값을 구하려면 PHP 8.3 이상에서 제공하는 str_increment()를 사용합니다. 문자열 감소는 --의 대칭 동작으로 가정하지 말고 str_decrement()를 사용하세요.
<?php
// PHP 8.3 이상
$label = 'z';
echo str_increment($label), PHP_EOL;
echo $label, PHP_EOL;
echo str_decrement('aa'), PHP_EOL;
try {
str_decrement('a');
} catch (ValueError $e) {
echo "더 감소시킬 수 없는 문자열입니다.", PHP_EOL;
}
이 예제는 aa, z, z와 오류 안내 문장을 순서대로 출력합니다. str_increment()는 새 문자열을 반환하고 $label 자체를 변경하지 않습니다. 결과를 보관하려면 $label = str_increment($label)처럼 대입해야 합니다. 두 함수는 ASCII 영문자·숫자 문자열용이며 한글 가나다의 다음 글자를 찾는 함수가 아닙니다.
빈 문자열이나 허용되지 않은 문자를 넘기면 ValueError가 발생하고, str_decrement()에는 a처럼 더 감소시킬 수 없는 입력도 있습니다. 함수 정의와 예외는 str_increment() 문서와 str_decrement() 문서를 확인하세요. 구버전 PHP에서는 이 함수들이 없으므로 필요한 최소 버전을 먼저 확인해야 합니다.
숫자 개수를 세려면 변수를 정수로 초기화하고 숫자 입력을 검증하세요. bool이나 null 등의 값을 숫자 카운터 대신 사용하면 버전에 따른 경고나 예상하지 못한 변환을 만날 수 있습니다. 알파벳의 증가와 감소를 일반적인 숫자 증감과 같은 기능으로 설명해서는 안 됩니다.




