Language/C

[ C ] 연산자

곽수진 2021. 10. 5. 18:15
반응형
종류 연산자
산술 연산자 x+y   x-y   x*y   x/y   x%y   +x   -x
증감 연산자 x**   **x   x--   --y
관계 연산자 x>y   x<y   x>=y   x<=y   x==y   x!=y
논리 연산자 x&&y   x||y   !x
비트 연산자 x&y   x|y   x^y   ~x   x<<y   x>>y
대입 연산자 x=y   x+=y   x-=y   x*=y   x/=y   x%=y   x&=y   x|=y   x^=y   x>>=y   x<<=y
멤버 접근 연산자 *x   &x   x[y]   x.y   x->y
그 밖의 연산자 x?y:z   x,y   sizeof(x)   (type)x

 

  • 증감 연산자 : 증가 (+1), 감소 (-1) 연산

      → 상수수식에는 사용할 수 없음

 

Ex.

a = a + 1    →  a++ / ++a
a = a - 1    →   a-- / --a

 

 

- prefix, 전치형(전위형)

a = 5;
printf("%d", ++a);

1. 증가 ++a : a의 값이 6으로 증가됨

2. 출력 printf() : a 값이 출력됨

    → a가 6으로 변한 후 값이 출력

 

 

- postfix, 후치형(후위형)

a = 5;
printf("%d", a++);

1. 출력 printf() : a의 값이 5로 출력

2. 증가 a++ : a의 값이 6으로 증가

    → a가 출력된 후 6으로 변함

 

 

  • 산술 연산자 : 기본 사칙연산

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int x, y;
	scanf("%d%d", &x, &y);

	printf("합 %d\n", x + y);
	printf("차 %d\n", x - y);
	printf("곱 %d\n", x * y);
	printf("몫 %d\n", x / y);
	printf("나머지 %d\n", x % y);


	return 0;
}

 

결과값 출력 모습

 

Ex.

4 / 5 = 0

정수 / 정수 몫을 정수로 구함

 

결과값으로 0.8을 출력하고 싶다면?

 

정수 / 정수 결과는 정수이므로 둘 중 하나를 실수로 변경하자!

 

 

 

방법 1. 정수 4를 실수 4.0으로 바꿔 연산

4.0 / 5 => 실수 / 정수 => 실수 / 실수 => 실수

묵시적(암묵적) 형변환 : 컴퓨터가 자동으로 형변환 함

                               → 정수를 자동으로 실수로 형변환

 

 

방법 2. 형변환 연산자 활용

정수 / 정수를 실수 / 정수로 바꿔보자!

int x=4, y=5;
(double) x / y => 실수 / 정수 => 실수 / 실수 => 실수

명시적 형변환 : 형변환 연산자(cast)로 일시적 형변환 함

 

 

★ 형변환(cast) ★

: 피연산자의 자료형이 서로 다른 경우 하나의 자료형으로 변환되어 연산이 수행됨 

 

- 묵시적(암묵적) 형변환

 

    ▶ 연산 : 큰 자료형을 따라감

정수 정수 => 정수    short + int => int
실수 실수 => 실수    float + double => double
정수 실수 => 실수    int + double => double

 

 

    ▶ 대입

double x = 55;

: 정수 55가 실수(double형)로 변함

 

 

    ▶ 정수의 (정수형) 승격

short a = 2;
short b = 3;

a*b → short * short
     → 정수 (4 byte로 형변환)

: 정수형으로 사용 가능한 short(2 byte), char(1 byte) 연산 과정

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	short a = 2, b = 3;

	printf("%d %d %d\n", sizeof(a), sizeof(b), sizeof(a * b));

	return 0;
}

 

결과값 출력 모습

 

 

- 명시적 형변환

 

    ▶ (자료형) 변수

 

    ▶ 일시적인 형변환

 

 

자료의 변환연산자가 진행하므로 명시적 형변환시 (int) 3.4와 같이 연산자에 괄호를 붙임 ★

 

 

  • 대입 연산자(할당 연산자, 치환 연산자) : 변수 대입 연산

    → 좌변에 있는 변수에 우변의 값을 저장

    → 매크로 상수나 const 변수에는 대입할 수 없음

 

 

l-value : 대입 연산자의 왼쪽을 의미함

            값을 변경할 수 있는 요소, 즉 변수를 의미

 

Ex.

int width;
width = 100;    (O)
100 = width;    (X)

 

 

  • 복합 대입 연산자 ( 축약 대입 연산자 )

      : 산술/비트 연산자대입 연산자를 결합

 

Ex.

a = a+2
a += 2

 

 

  • 관계 연산자 : 크기 비교 연산

    → C언어에는 부울값 데이터를 취급하지 않음

        : 정수 1, 거짓정수 0으로 저장

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {

	printf("%d\n", 2 > 3); // 거짓은 0, 참은 1
	printf("%d\n", 2 + 3);

	return 0;
}

 

결과값 출력 모습

 

 

    → 관계 연산식을 조합할 때는 논리 연산자를 함께 사용함

90 <= score <= 100                   (X)
90 <= scroe && score <= 100     (O)

    → expr != 0expr는 같은 의미임

if (expr != 0)
    do something;

: expr이 0이 아닌가? 그렇다면 do something

 

if (expr)
    do something;

: expr이 (0이 아닌 값)인가? 그렇다면 do something

 

 

  • 논리 연산자 : 표현식 연결 연산

    → 피연산자가 0이 아니면 참으로 간주

 

논리 연산자 부울 대수 의미
x && y 논리 AND x와 y가 둘 다 0이 아니면 1, 그렇지 않으면 0
x || y 논리 OR x와 y 중 하나라도 0이 아니면 1, x와 y가 둘 다 0이면 0
!x 논리 NOT x가 0이면 1, x가 0이 아니면 0

 

usage >= 1000 && usage <= 2000
(usage >= 1000) && (usage <= 200)

&&, || 연산보다 관계 연산을 먼저 수행

 

 

! expr == value
(! expr) == value

! 연산관계 연산보다 먼저 수행

 

 

expr1 || expr2 && expr3
→ expr1 || (expr2 && expr3)

&& 연산 || 연산보다 먼저 수행

 

 

if (expr == 0)
    do something;

→ if (! expr)

        do something;

0인지 비교하는 대신 ! 연산자 사용

 

 

  • 조건 연산자 : 조건에 맞는 표현식 실행 연산 → 삼항 연산자
- 조건식? 항1 : 항2
- 변수 = 조건식 ? 참 : 거짓
- 조건식? printf(참) : printf(거짓)
- printf("서식", 조건식? 참식 : 거짓식) 참식과 거짓식이 같은 자료형일 경우만 사용

: 조건식이 참(1)이면 참식, 거짓(0)이면 거짓식을 출력

 

 

  • 비트 연산자 : 저장된 데이터를 비트 단위로 연산

     → 피연산자로 정수형만 사용할 수 있음

 

구분 비트 연산자 의미
비트 논리 연산자 x & y x와 y의 각 비트 단위로 논리 AND 연산
x | y X와 Y의 각 비트 단위로 논리 OR 연산
x ^ y X와 Y의 각 비트 단위로 논리 XOR 연산
~ x X의 각 비트 단위로 논리 NOT 연산
비트 이동 연산자 x << y X의 각 비트를 Y만큼 왼쪽으로 이동
x >> y X의 각 비트를 Y만큼 오른쪽으로 이동

 

 

반응형