증가·감소 연산자

증가·감소 연산자

변수 값을 1씩 올리거나 내리는 증가·감소 연산자입니다. 전위(++$a)와 후위($a++)의 차이를 이해하게 돼요.

출처: Increment and Decrement

본문

PHP는 C 스타일의 전위·후위 증가/감소 연산자를 지원해요. 이 단항 연산자들은 값을 1씩 증가시키거나 감소시킬 수 있습니다.

증가/감소 연산자 (Increment/Decrement Operators)

예제 이름 효과
++$a 전위 증가 $a를 1 증가시키고 $a를 반환.
$a++ 후위 증가 $a를 반환한 다음 $a를 1 증가시킴.
--$a 전위 감소 $a를 1 감소시키고 $a를 반환.
$a-- 후위 감소 $a를 반환한 다음 $a를 1 감소시킴.
<?php
echo 'Post-increment:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);

echo 'Pre-increment:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);

echo 'Post-decrement:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);

echo 'Pre-decrement:', PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);
?>

Post-increment:
int(5)
int(6)
Pre-increment:
int(6)
int(6)
Post-decrement:
int(5)
int(4)
Pre-decrement:
int(4)
int(4)

경고: 증가·감소 연산자는 bool 타입의 값에는 아무 효과가 없어요. PHP 8.3.0부터 E_WARNING이 발생하는데, 향후 그 값을 암묵적으로 int로 캐스팅하기 때문이에요.

경고: 감소 연산자는 null 타입의 값에는 아무 효과가 없어요. PHP 8.3.0부터 E_WARNING이 발생하는데, 향후 그 값을 암묵적으로 int로 캐스팅하기 때문이에요.

경고: 감소 연산자는 숫자 문자열(numeric string)이 아닌 값에는 아무 효과가 없어요. PHP 8.3.0부터 E_WARNING이 발생하는데, 향후 TypeError가 발생할 것이기 때문이에요.

참고: 덧셈/뺄셈 오버로딩을 지원하는 내부 객체도 증가·감소시킬 수 있어요. 그런 내부 객체 중 하나가 GMP입니다.

PERL 문자열 증가 기능

경고: 이 기능은 PHP 8.3.0부터 soft-deprecated(권장되지 않음) 처리됐어요. 대신 str_increment() 함수를 사용해야 합니다. PHP 8.5.0부터 숫자 문자열이 아닌 문자열을 증가시키면 deprecation 경고가 발생해요.

PHP에서는 숫자 문자열이 아닌 문자열도 증가시킬 수 있어요. 그 문자열은 영숫자(alphanumerical) ASCII 문자열이어야 합니다. 문자를 다음 문자로 증가시키고, Z에 도달하면 증가가 왼쪽 값으로 넘어갑니다. 예를 들어 $a = 'Z'; $a++;$a'AA'로 바꿔요.

<?php
echo '== Alphabetic strings ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
    echo ++$s . PHP_EOL;
}
// Alphanumeric strings behave differently
echo '== Alphanumeric strings ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
    echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
    echo ++$d . PHP_EOL;
}
?>

== Alphabetic strings ==
X
Y
Z
AA
AB
AC
== Alphanumeric strings ==
A9
B0
B1
B2
B3
B4
A09
A10
A11
A12
A13
A14

경고: 영숫자 문자열이 숫자 문자열로 해석될 수 있다면 int나 float로 캐스팅돼요. 지수 표기법으로 쓰인 부동소수점처럼 보이는 문자열에서 특히 문제가 되죠. str_increment() 함수는 이런 암묵적 타입 캐스팅 문제가 없습니다.

<?php
$s = "5d9";
var_dump(++$s);
var_dump(++$s);
?>

string(3) "5e0"
float(6)

더 알아보기