C & C++/디딤돌 C언어

Part 11. 대입, 증감, 기타 연산자

언휴 2024. 1. 9. 08:55
C언어 - 대입, 증감, 기타 연산자
00:14 대입 연산자
01:09 [실습] 대입 연산자 l-value
01:42 [실습] 복합 대입 연산자
02:19 [실습] 대입 연산자 우선 순위
03:27 증감 연산자
03:57 [실습] 증감 연산자
05:15 기타 연산자
05:28 [실습] 콤마 연산자
06:30 [실습] 형 변환 연산자
07:05 [실습] sizeof 연산자
07:45 [실습] 삼항 조건 연산자

35. 대입 연산자

=, +=, -=, *=, /=, %= 등

대입 연산은 변수의 값을 설정할 때 사용하는 연산이죠.
이러한 이유로 대입 연산의 좌항에는 상수 표현은 올 수 없으며 l- value라 불러요.

대입 연산자에는 우항의 값을 좌항에 대입하는 단순 대입 연산과 좌항과 우항의 값을 더하거나 빼는 등의 연산을 수행한 후에 좌항에 대입하는 복합 대입 연산도 있어요.

◈ 복합 대입 연산 예

#include <stdio.h>
int main()
{
    int i = 2;
    i +=  4; // i = i + 4; 와 같은 표현
    printf("i: %d \n",i);
    return 0;
}

◈ 실행 결과

i: 6

주의할 점은 대입 연산은 모든 연산 중에 우선 순위가 가장 낮다는 것이예요.
예를 들어 i = j == 3; 구문은 j의 값이 3이면 i에 1을 대입하고 3 이외의 값이면 0을 대입하는 구문이예요.
하나의 구문에 두 개 이상의 연산을 수행할 때는 ( )괄호 연산자를 이용하여 먼저 수행할 연산을 명확하게 표현하세요.

◈ 대입 연산자의 우선 순위를 확인하는 예

#include <stdio.h>
int main()
{
    int i = 0,  j = 0;
 
    j=0;
    i = j != 3;
    printf("%d\n",i);
 
    j = 1;
    i = j != 3;
    printf("%d\n",i);
 
    j = 2;
    i = j != 3;
    printf("%d\n",i);
    return 0;
}

◈  실행 결과

1
1
1

◈ 기본 연습 
1. 다음 프로그램의 출력 결과를 예측하시오.

#include <stdio.h>
int main()
{
    int i = 8;
    i *= 4;
    printf("%d \n", i);
    return 0;
} 
더보기

답: 32
i *= 4; 는 i = i*4; 와 같은 결과를 갖습니다.

2. 다음 프로그램의 출력 결과를 예측하시오.

2. 다음 프로그램의 출력 결과를 예측하시오.

#include <stdio.h>
int main()
{
    int i = 8;
    int j = 0;
 
    j = i == 8; 
    printf("%d %d\n", i, j);
    return 0;
}
더보기

답:
8 1
j=i==8; 은 i==8 연산을 수행한 후에 수행 결과를 j에 대입합니다.
i==8은 연산 결과가 참이므로 1입니다.

 

3. 다음 프로그램에서 잘못된 부분을 찾고 이유를 설명하시오.

#include <stdio.h>
int main()
{
    int i = 8;
    i + 2 = 9;
    printf("%d \n", i);
    return 0;
}
더보기

답:
i+2 = 9;
i+2는 연산 결과이므로 상수입니다.
상수는 대입 연산자 좌항에 올 수 없습니다.

36. 증감 연산자

++, — (증감 연산자)

증감 연산자는 단항 연산자로 1 증가하거나 1을 감소하는 연산이예요.
증감 연산을 수행하면 피연산자의 값을 변경하므로 피연산자는 l-value만 올 수 있어요.

++의 연산을 수행하면 피연산자의 값이 1 증가하고 — 연산을 하면 1감소하죠.

증감 연산자는 연산자가 피연산자 앞에 올 수도 있고 뒤에 올 수도 있는데 위치에 따라 연산 결과가 달라요.
그리고 증감 연산자가 피연산자 앞에 올 때 전위 증감 연산자라 부르며 뒤에 올 때 후위 증감 연산자라 불러요.

전위 증감 연산이 하는 것은 피연산자의 값을 1 증감하는 것이며 연산 결과도 값을 1 증감한 피연산자예요.
하지만 후위 증감 연산에서는 피연산자의 값은 1 증감하지만 연산 결과는 연산을 수행하기 전 피연산자의 값이죠.

re = i++;
//re = i;
//i = i+1;
re = ++i;
//i = i+1;
//re = i;
여러분께서 증감 연산자를 사용할 때 다른 표현식과 혼합하여 사용하지 마세요.
혼합하지 않는다면 코드를 분석하고 이해하는 것이 어렵지 않겠지만 혼합하여 사용하면 어려울 수 있어요.
증감 연산자는 다른 표현식과 혼합하여 사용하지 마시고 단독으로 사용하세요.

◈ 전위 후위 증감 연산자 비교

#include <stdio.h>
int main()
{
    int a = 2, b = 2;
    printf("수행 전 a: %d \n",a);
    printf("++a 연산 결과: %d \n",++a);
    printf("수행 후 a: %d \n",a);
    printf("수행 전 b: %d \n",b);
    printf("b++ 연산 결과: %d \n",b++);
    printf("수행 후 b: %d \n",b);
    return 0;
}

◈  실행 결과

수행 전 a: 2
++a 연산 결과: 3
수행 후 a: 3
수행 전 b: 2
b++ 연산 결과: 2
수행 후 b: 3

◈ 기본 연습
다음 프로그램의 실행 결과를 예측하시오.

#include <stdio.h>
int main()
{
    int i = 8, re = 0;
    re = i++;
    printf("i:%d re:%d \n", i, re);
    return 0;
}
더보기

답:
i:9 re:8
re = i++; 연산은 i++ 연산을 수행하고 연산 결과를 re에 대입하는 구문입니다.
i++; 은 자신의 값을 1 증가하며 연산 결과는 증가하기 전의 값입니다.
따라서 i는 1 증가하여 9이며 re에는 증가하기 전의 값이 8입니다.

37. 기타 연산자

C언어에서는 이 외에도 여러 표현식을 나열하는 쉼표 연산자와 표현식 값의 형식을 변환할 때 사용하는 형변환 연산자, 표현식의 메모리 크기를 계산하는 sizeof, 조건에 맞게 특정 표현식을 사용하는 조건부 연산자등을 제공하고 있어요.

쉼표 연산자는 변수 선언 등에서 대등한 표현식을 나열할 때 사용할 수 있어요.

int i=0, j=0;

◈ 여러 개의 표현식을 나열하는 쉼표 연산자의 사용 예

#include <stdio.h>
enum _Gender{    FEMALE,    MALE  }; //열거형 정의문
int Compare(int a,int b); //함수 선언문
int main()
{
    int arr[3] = {1,2,3}; //배열 선언문
    int i=0, j=0;
    int gap=0;
    gap = Compare(i,j); //함수 호출문
    return 0;
}
int Compare(int a,int b) //함수 정의문
{
    return a-b;
}
 

형변환 연산자는 단항 연산자로 피연산자 앞에 소괄호와 소괄호 안에 변환을 원하는 형식을 명시해서 사용해요.
C언어에서는 char 형식과 int 형식 사이 등에서 개발자가 명시하지 않아도 묵시적으로 형변환을 제공하고 있죠.
언어에서 묵시적으로 형변환을 제공하지 않고 반드시 변환할 때만 형변환 연산자를 사용하세요.

◈ 정수 사이의 나누기 연산을 형변환 연산을 이용하여 계산하는 예

#include <stdio.h>
int main()
{
    int i = 8;
    printf("%d \n",i / 3);
    printf("%f \n",(float)i / 3);
    return 0;
}

◈ 실행 결과

2
2.666667

sizeof 연산자는 함수처럼 보이지만 표현식을 위해 할당해야 하거나 할당한 메모리 크기를 계산하는 연산자예요.
sizeof 연산자는 함수 호출식과 다름게 중괄호 안에 형식 이름을 사용할 수 있어요.

◈ sizeof 연산자로 메모리 크기를 계산하는 예

#include <stdio.h>
int main()
{
    int a;
    printf("a의 메모리 크기: %d 바이트 \n", sizeof(a));
    printf("int 형식의 메모리 크기: %d 바이트 \n", sizeof(int));
    return 0;
}

◈ 실행 결과

a의 메모리 크기: 4 바이트
int 형식의 메모리 크기: 4 바이트

C언어에서는 삼항 연산자로 조건부 연산자를 제공하고 있어요.
구문 중에 조건문을 사용하는 것이 코드를 분석하고 이해하기 쉽기 때문에 많이 사용하는 연산자는 아니예요.

표현식 ? 표현식 : 표현식

삼항 연산자를 사용하면 맨 앞의 표현식은 조건식이 와요.
조건식이 참이면 연산 결과는 두 번째 표현식의 값이고 거짓이면 세 번째 표현식의 값이예요.
따라서 첫 번째 표현식이 참이면 두 번째 표현식만 수행하고 거짓이면 세 번째 표현식만 수행한답니다.

◈ 삼항 연산자를 사용하는 예

#include <stdio.h>
int main()
{
    int i = 3, j = 2;
    printf("%d \n", (i>j)? i: j);
    return 0;
}

◈ 실행 결과

3

이 외에도 주소를 얻어오는 연산이나 배열과 포인터를 선언할 때 사용하는 연산 및 배열과 포인터, 구조체, 공용체를 사용할 때 필요한 연산들이 있는데 이들에 관한 사항은 뒤에서 다룰게요.