카메라 개발자 공부방(SW)

[3장] 연산자 본문

Langauge/C

[3장] 연산자

luckmart 2021. 9. 22. 16:01
반응형

오늘은 연산자에 대해서 이야기해보겠습니다.

다음은 C언어에서 사용되는 모든 연산입니다.

 

연산자 종류

산술 연산자 +, -, *, /, %
증감 연산자 ++, --
대입 연산자 =, -=, +=, *=, /=
비교 연산자 <, >, <=, >=, ==, !=
논리 연산자 &&, ||, !
비트 연산자 &, |, ~, ^
쉬프트 연산자 <<, >>
간접, 주소 연산자 *, &, []
형 변환, 괄호  연산자 ( )
멤버 접근 . ->   
조건(삼항 연산자) 조건?  your code1 : your code2  

 

산술 연산자
기본적인 사칙연산을 할 수 있습니다.

#include<stdio.h>

int main()
{
    int val0 = 10;
    int val1 = 20;

    printf("%d\n", val0 + val1);
    printf("%d\n", val0 - val1);
    printf("%d\n", val0 * val1);
    printf("%d\n", val0 / val1);

    return 0;
}         

// 실행결과
// 30
// -10
// 200
// 0     -> int 타입으로 명시된 메모리는 무조건 소수점을 버립니다.  0.2 -> 0

+, -, *, / 는 설명이 따로 필요 없겠죠?

#include <stdio.h>

int main()
{
    int val0 = 10;
    int val1 = 20;
    printf("%d\n", val0 % val1);

    return 0;
}         

// 실행결과
// 10

% 연산자는 나눈 나머지 값을 의미합니다. 10을 20으로 나눈 나머지는 10입니다.

#include <stdio.h>       // 1 line
                         // 2
int main()               // 3
{                        // 4
    int n = 1;           // 5  
    printf("%d\n", n++); // 6
    return 0;            // 7
}

// 실행결과
// 1

후위 연산자는 선행된 연산이 끝난 후, 나중에 값을 증가시킵니다. 여기선 5 line이 완전히 끝난 후에 증가됩니다. 

#include <stdio.h>       // 1 line
                         // 2
int main()               // 3
{                        // 4
    int n = 1;           // 5
    printf("%d\n", ++n); // 6
    return 0;            // 7
}                        // 8

// 실행결과
// 2

선위 연산자는 값을 먼저 증가시킨 후 연산합니다. 여기선 5 line 도입하자마자 1을 증가시킨 후 printf의 인자로 전달됩니다.

#include <stdio.h>

int main()
{
    int n = 1;
    n = n + 10;

    printf("%d\n", n);
    return 0;
}

// 실행결과
// 11

이 예제는 10을 더하는 예제입니다.

#include <stdio.h>

int main()
{
    int n = 1;
    n += 10; // n = n + 10

    printf("%d\n", n);
    return 0;
}

// 실행결과
// 11

방금 했던 10을 더한 연산과 n += 10 연산은 동일합니다. 이런 방법으로도 합을 표현할 수 있습니다.

논리 연산자
&&, ||, ==, !-

논리식에서 세부 논리 조건을 결정해야 될 때 논리 연산자가 사용됩니다.


&& 그리고
||    혹은
== 같다면
!=  같지 않다면

 

A && B // A도 참이고 B도 참인 경우에 참

A || B    // A와 B 중에 하나만 참이어도 참

A == B // A와 B가 같을 때만 참
A != B  // A와 B가 같지 않을 때만 참

#include <stdio.h>

int main()
{
    int a = 30;
    if (1 <= a && a <= 50) {
        printf("1 <= a && a <= 50\n");
    }

    return 0;
}

// 실행결과 
// 1 <= a && a <= 50

a는 1 이상 그리고 50 이하의 값이기 때문에 두 조건 모두 충족합니다. (if는 조건 제어자입니다. 인자의 결과가 참일 때만 { }가 수행됩니다.)

#include <stdio.h>

int main()
{
    int a = 30;
    if (1 <= a || a <= -20) {
        printf("1 <= a || a <= 50\n");
    }

    return 0;
}
// 실행결과 
// 1 <= a || a <= 50

 

a <= -20 조건이 충족되지 않더라도 1 <= a는 조건을 만족합니다.

#include <stdio.h>

int main()
{
    if (50 == 50) {
        printf("50 == 50\n");
    }

    return 0;
}
// 실행결과 
// 50 == 50

50과 50은 같기 때문에 참입니다.

#include <stdio.h>

int main()
{
    if (50 != 50) {
        printf("50 != 50\n");
    }
    else {
        printf("50 == 50\n");
    }

    return 0;
}
// 실행결과 
// 50 == 50

50 != 50은 같기 때문에 거짓입니다.

쉬프트 연산자
비트 단위에서 오른쪽 혹은 왼쪽으로 비트 전부를 이동시킵니다.

#include <stdio.h>

int main()
{
    int a = 4;
    printf("%d\n", (a << 1));
    return 0;
}
// 실행결과 
// 8
a 000000100
a << 1 000001000

비트가 왼쪽으로 한 칸 이동했습니다.

#include <stdio.h>

int main()
{
    int a = 4;
    printf("%d\n", (a << 2));
    return 0;
}
// 실행결과 
// 16
a 000000100
a << 2 000010000

비트가 왼쪽으로 두 칸 이동했습니다.

#include <stdio.h>

int main()
{
    int a = 8;
    printf("%d\n", (a >> 2));
    return 0;
}
// 실행결과 
// 2
a 000001000
a >> 2 000000010

비트가 오른쪽으로 두 칸 이동했습니다.

#include <stdio.h>

int main()
{
    int a = 8;
    printf("%d\n", (a >> 2));
    return 0;
}
// 실행결과 
// 2
a 000001000
a >> 2 000000010

비트가 오른쪽으로 두 칸 이동했습니다.

 

비트 연산자
비트 단위에서 AND, OR, XOR, NOT 연산을 합니다.

#include <stdio.h>

int main()
{
    int a = 8;
    int b = 4;
    printf("%d\n", a & b);
    return 0;
}
// 실행결과 
// 0
a 000001000
b 000000100
a & b 000000000

정수를 비트로 환산한 후, 비트 당 & 연산을 수행합니다(and 연산).

#include <stdio.h>

int main()
{
    int a = 7;
    int b = 4;
    printf("%d\n", a & b);
    return 0;
}
// 실행결과 
// 4
a 000000111
b 000000100
a & b 000000100

또 다른 예제

#include <stdio.h>

int main()
{
    int a = 8;
    int b = 4;
    printf("%d\n", a | b);
    return 0;
}
// 실행결과 
// 6
a 000001000
b 000000100
a | b 000001100

이번엔 정수를 비트로 환산한 후, 비트 당 | 연산을 수행합니다. (or 연산)

#include <stdio.h>

int main()
{
    int a = 7;
    int b = 4; 
    printf("%d\n", a | b);
    return 0;
}
// 실행결과 
// 7
a 000000111
b 000000100
a | b 000000111

또 다른 예제~

#include <stdio.h>

int main()
{
    int a = 7;
    int b = 4;
    printf("%d\n", a ^ b);
    return 0;
}
// 실행결과 
// 3
a 000000111
b 000000100
a ^ b 000000011

이번엔 정수를 비트로 환산한 후, ^ 연산을 수행합니다. (exclusive or) 

비트가 서로 다를 때 1이라 생각하세요

#include <stdio.h>

int main()
{
    int a = 4;
    printf("%d\n", ~a);
    return 0;
}
// 실행결과 
// -5
a 000000100
~a 111111011

~연산은 정수의 비트를 반전시키는 연산입니다. 맨 앞의 비트는 부호를 담당하기 때문에 음수가 되었습니다. (0이면 양수, 1이면 음수)


여기서 다루지 않은 연산은 다른 챕터에서 공부할 때 다뤄보겠습니다.

(주소=포인터)

(멤버 접근=구조체)

(삼항 연산자=조건문)

 

'Langauge > C' 카테고리의 다른 글

[6장] 자료형(data type)  (0) 2021.09.25
[5장] 반복문  (0) 2021.09.24
[4장] 조건 제어문  (0) 2021.09.23
[2장] 변수  (0) 2021.09.21
[1장] C언어 start  (0) 2021.09.20
Comments