C 언어에서는 별도의 임시 변수 없이도 단 한 줄의 코드만으로 두 변수의 값을 서로 교환(swap)할 수 있습니다. 이 글에서는 산술 연산자를 활용하는 방법과 XOR 비트 연산을 활용하는 방법, 총 두 가지 기법을 예제 코드와 함께 소개합니다.
예제 코드
#include <stdio.h>
int main() {
int a = 28, b = 8;
a += b -= a = b - a; // 방법 1
printf("교환 후 : %d\t%d", a, b);
(a ^= b), (b ^= a), (a ^= b); // 방법 2
printf("\n다시 교환 후 : %d\t%d", a, b);
return 0;
}
실행 결과
교환 후 : 8 28 다시 교환 후 : 28 8
위 프로그램은 변수 a와 b를 각각 28과 8로 초기화한 뒤, 한 줄짜리 코드로 두 값을 교환하는 과정을 두 차례에 걸쳐 보여줍니다.
방법 1: 산술 연산자 활용
a += b -= a = b - a;
대입 연산자는 오른쪽에서 왼쪽으로 결합되므로, 이 식은 아래 순서대로 평가됩니다.
a = b - a→ a = 8 - 28 = -20b -= a→ b = 8 - (-20) = 28a += b→ a = -20 + 28 = 8
그 결과 a에는 원래 b의 값인 8이, b에는 원래 a의 값인 28이 저장되면서 두 변수가 성공적으로 교환됩니다.
방법 2: XOR 비트 연산 활용
(a ^= b), (b ^= a), (a ^= b);
XOR(^) 연산은 "같은 값끼리 연산하면 0이 되고, 어떤 값에 0을 XOR하면 자기 자신이 된다"는 성질을 갖습니다. 이 성질을 이용하면 세 번의 XOR 연산만으로 두 값을 맞바꿀 수 있습니다.
a ^= b→ a = 28 ^ 8b ^= a→ b = 8 ^ (28 ^ 8) = 28a ^= b→ a = (28 ^ 8) ^ 28 = 8
그 결과 다시 a = 28, b = 8이 되어 두 값이 원래대로 돌아옵니다.
참고: 실무에서의 주의점
이런 한 줄 스왑 기법은 흥미로운 트릭이지만, 실제 프로젝트에서는 가독성과 안정성을 위해 임시 변수를 사용하거나 C++에서는 std::swap()을 사용하는 것이 좋습니다. 특히 방법 1처럼 하나의 식 안에서 같은 변수를 여러 번 수정하는 코드는 컴파일러나 최적화 옵션에 따라 결과가 달라질 수 있으므로 주의가 필요합니다.