안녕하세요. 언제나 휴일의 언휴예요.
대입 연산자와 l-value 복합 대입 연산자
1. 대입 연산자와 l-value
프로그래밍에서 변수에 원하는 값을 설정할 때 대입 연산자를 사용하죠.
당연히 대입 연산자 왼쪽(좌항)에는 상수 표현은 올 수 없어요.
정수형 변수 i가 있을 때 i+3=7; 표현은 문법적 오류가 발생해요.
i+3의 연산 결과는 상수이며 l-value로 사용할 수 없어요.
#include <stdio.h> int main() { int i = 0;//초기화 i = 7;//변수 i에 7을 설정 i + 3 = 7;//i+3에 7을 설정. i+3의 연산 결과는 상수 return 0; }
위 코드를 빌드하였을 때 나오는 결과를 보면 l-value로 사용할 수 없다는 오류가 발생하죠.
빌드 시작... 1>------ 빌드 시작: 프로젝트: lvalue, 구성: Debug Win32 ------ 1>Program.c 1>D:\동영상 강의\언제나 C언어\대입 연산\lvalue\Program.c(6,14): error C2106: '=': 왼쪽 피연산자는 l-value이어야 합니다. 1>"lvalue.vcxproj" 프로젝트를 빌드했습니다. - 실패
이처럼 실제 개발에서 대입 연산의 왼쪽(좌항)에 l-value로 사용할 수 없는 표현을 쓰면 오류가 발생해서 개발자는 쉽게 문제를 해결할 수 있어요.
시험을 보는 곳에서는 이러한 부분이 어려울 수도 있겠지만 실제 개발에서는 개발 도구와 구글을 비롯한 여러 도움을 받을 수 있어서 해결하기 어려운 문제는 아니예요.
2. 복합 대입 연산자
코드를 작성하다 보면 다른 연산을 수행한 결과를 대입하는 일은 매우 흔한 일이죠.
복합 대입 연산자는 l-value 자신을 피 연산자로 사용할 때 간단하게 표현할 수 있는 연산자입니다.
변수 i에 i+3 연산 결과를 대입하는 표현은 i=i+3; 입니다.
이를 간단하게 i+=3;으로 표현할 수 있어요.
#include <stdio.h> int main() { int i = 0;//초기화 i = i+3;//변수 i에 i+3 연산 결과를 설정 printf("i:%d\n", i); i += 3;//변수 i에 자기 자신(i)에 3을 더한 값을 설정 printf("i:%d\n", i); return 0; }
실행하면 예상처럼 3과 6을 출력해요.
i:3 i:6
이 때 +=을 복합 대입 연산자라고 부릅니다. 주의할 점은 하나의 연산이라 += 사이에 공백이 올 수 없어요.
다음 코드는 의도적으로 += 연산 사이에 공백을 넣은 코드예요.
#include <stdio.h> int main() { int i = 0;//초기화 i + = 3;//변수 i에 자기 자신(i)에 3을 더한 값을 설정 printf("i:%d\n", i); return 0; }
빌드하면 다음처럼 오류가 발생하죠.
다시 빌드 시작... 1>------ 모두 다시 빌드 시작: 프로젝트: 복합 대입 연산에서의 오류, 구성: Debug Win32 ------ 1>Program.c 1>D:\동영상 강의\언제나 C언어\대입 연산\복합 대입 연산에서의 오류\Program.c(5,9): error C2059: 구문 오류: '=' 1>"복합 대입 연산에서의 오류.vcxproj" 프로젝트를 빌드했습니다. - 실패
이러한 문제도 실제 개발에서는 아무런 이슈가 아니예요. 빌드 오류를 보고 쉽게 수정할 수 있거든요.
복합 대입 연산에는 += 외에도 산술 연산(-=, *=, /=, %=)과 비트 연산(<<=, >>=, &= ,|=, ^=) 등에서 가능합니다.
(<, <=, >, >=, &&, || 연산은 복합 대입 연산을 제공하지 않아요.)
#include <stdio.h> int main() { int i = 3;//초기화 i += 3;//i:6 printf("%d\n", i); i -= 1;//i:5 printf("%d\n", i); i *= 2;//i:10 printf("%d\n", i); i /= 2;//i:5 printf("%d\n", i); i %= 3;//i:2 printf("%d\n", i); i <<= 4;//i:32 printf("%d\n", i); i >>= 4;//i:2 printf("%d\n", i); i |= 5;//i:7 printf("%d\n", i); i &= 5;//i:5 printf("%d\n", i); i ^= 3;//i:6 printf("%d\n", i); return 0; }
실행 결과는 다음과 같아요.
6 5 10 5 2 32 2 7 5 6
여러분께서 미리 연산 결과를 쉽게 예측할 수 있는 표현이 아니라면 복합 대입 연산을 사용하지 마세요.
연산 결과를 쉽게 예측하기 어렵다는 것은 연산이 어렵거나 작성한 코드를 분석하기 어려운 것일 수 있겠죠.
실제 프로그램을 작성할 때 사칙 연산 정도에서 복합 대입 연산을 사용하는 개발자가 많은 것 같네요.