대입 연산의 왼쪽(좌항)에 오는 표현을 l-value라고 불러요. [언제나 C언어]

안녕하세요. 언제나 휴일의 언휴예요.

대입 연산자와 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

여러분께서 미리 연산 결과를 쉽게 예측할 수 있는 표현이 아니라면 복합 대입 연산을 사용하지 마세요.

연산 결과를 쉽게 예측하기 어렵다는 것은 연산이 어렵거나 작성한 코드를 분석하기 어려운 것일 수 있겠죠.

실제 프로그램을 작성할 때 사칙 연산 정도에서 복합 대입 연산을 사용하는 개발자가 많은 것 같네요.