Home C언어 공부 정리(2/10)-연산자 종류
Post
Cancel

C언어 공부 정리(2/10)-연산자 종류

21/12/30

0. 연산자의 우선순위

  • 연산을 할 때 가장 먼저 계산되는 것 ~ 가장 나중에 계산되는 순서
    • 1 + 1 * 2 = 3 ( 곱셈먼저 계산 )
    • (1 + 1 ) * 2 = 4 ( 괄호먼저 계산 )
  • 순서
    • () ⇒ 증감, !, (포인터), &(주소) ⇒ 사칙연산(, /, % ⇒ +, -) ⇒ 시프트 ⇒ 비교 ⇒ 비트 ⇒ 논리(&&, ||) ⇒ 대입

1. 산술연산자 (+, -, *, /, %)

  • 사칙연산
  • % : 나머지
    • 사용법
      1
      
      printf("%d",35%5);
      

      결과 : 0

2. 증감연산자 (++, –)

  • 피연산자를 1씩 증가 또는 감소
  • 연산자의 위치에 따라 증감시점이 달라지므로 유의!
  • ++a : a 증가시킨 후 연산
  • a++ : 연산 후 a 증가

ex 1)

1
2
3
4
  int a, b;
  a = 4;

  b = ++a * ++a;
  • ++a(1) * ++a(2) 연산순서
    1.   (1) a = 4 + 1
    2.   (2) a = 5 + 1
    3.   b = 6 * 6
      ∴ a = 6, b = 36
  • ++a : 연산보다 우선순위가 높으므로 ++먼저 계산

ex 2)

1
2
3
4
  int a, b;
  a = 10;

  b = a++ - a--;
  • a++(1) - a--(2) 연산순서
    1.   b = 10 - 10
    2.   (1) a = 10 + 1
    3.   (2) a = 11 - 1
      ∴ a = 10, b = 0
  • a++ : 연산 후 계산

ex 3)

1
2
3
4
5
  int a, b, c;
  a = 3;
  b = 2;

  c = ++a + b++;
  • ++a + b++ 연산순서
    1.   a = 3 + 1
    2.   c = 4 + b++
    3.   c = 4 + 2
    4.   b = 2 + 1
      ∴ a = 4, b = 3, c = 6

ex 4)

1
2
3
4
5
  int a, b, c;
  a = 3;
  b = 2;

  c = a++ + ++b;
  • a++ + ++b 연산순서
    1.   c = 3 + ++b
    2.   b = 2 + 1
    3.   c = 3 + 3
    4.   a = 3 + 1
      ∴ a = 4, b = 3, c = 6

3. 대입연산자 (=, +=, -=, …)

사용법

1
2
3
4
5
6
7
int a = 25;

a += 3; // a = a + 3
printf("%d\n", a);

a -= 3; // a = a - 3
printf("%d\n", a); 

결과
  28
  25

4. 비교연산자 (>, =>, <, <=, ==, !=..)

  • 두 값의 비교
  • == : 두 값이 같은가?
  • != → 부정!
    • a != 9 » a는 9가 아니다
      1
      2
      3
      4
      5
      6
      7
      
        int num = 9;
      
        if(num != 9) {
            printf("거짓!"); // num이 9가 아닐 경우 실행
        } else {
            printf("참!"); // num이 9가 아닌것 이외일 경우(num이 9라면) 실행
        }
      

      결과 : 참!

5. 논리연산자 (&&, ||, !)

1) !

  • 부정!
  • 논리 뒤집기!
    • 참! = 거짓
    • 거짓! = 참
    • 1! = 0 (거짓)
    • 0! = 1 (참)
  • 컴퓨터 언어에서 0 이외의 숫자는 모두 참(True)
    • 따라서 3! = False   22! = False

2) &&

  • 거짓이 하나라도 있으면 false(F)
  • 거짓 을 찾은 순간 뒤의 조건은 더이상 확인하지 않음
  • 조건식거짓유무결과
    T&&FOF
    F&&TOF
    T&&TXT

3) ||

  • 참이 하나라도 있으면 true(T)
  • 을 찾은 순간 뒤의 조건은 더이상 확인하지 않음
  • 조건식참유무결과
    T||FOT
    F||TOT
    F||FXF

4) &&, || 조건이 3개 이상

  • ex )
    1. T && F && T;
      • { ( T && F ) && T } ⇒ { ( F ) && T } ⇒ F
    2. F || T || F;
      • { ( F || T ) || F } ⇒ { ( T ) || F } ⇒ T
    3. T || F && T;
      • { ( T || F ) && T } ⇒ { ( T ) && T } ⇒ T
    4. F && F || T;
      • { ( F && F ) || T } ⇒ { ( F ) || T } ⇒ T

6. 비트연산자 (&, |, ~, ^)

1) ~

  • 단항연산자
  • 1의 보수로 변환
    • 1011 » 0100
    • 0010 » 1101

2) ^

  • 이항연산자
  • 두 항의 값이 다르면 T, 같으면 F
    • T ^ F = T
    • F ^ T = T
    • T ^ T = F
    • F ^ F = F

3) &, |

  • | : 정보추가
  • & : 정보추출
  • ex) 좌석 예약(long x)
    • 미예약 : 0, 예약석 : 1

      좌석32좌석4좌석3좌석2좌석1
      00000
    1. 좌석3 예약 :   x = 4

      좌석32좌석4좌석3좌석2좌석1
      00100
    2. 좌석1 예약 :   x = x | 1

        0...0100 
      + 0...0001
      ------------
        0...0101
      
      좌석32좌석4좌석3좌석2좌석1
      00101
      • x = 1 » 0…0001 (이전 데이터는 사라지고 새로운데이터(x=1)가 저장됨)
    3. 좌석1 예약확인 :

      1
      2
      3
      4
      5
      
         if ( x & 1 ) { // x와 1 모두 T(1)인가?
         printf("예약되었습니다.");
         } else { // x가 F(0)인가?
         printf("예약되지 않았습니다.");
         }
      
      좌석32좌석4좌석3좌석2좌석1
      00101
      00001
      ----T
      • x에 1이 있는지 확인하고 결과 출력
      • 결과 : 예약되었습니다

7. 시프트연산 («, »)

  • 비트 연산자

    1) «

  • 비트 전체를 왼쪽으로 이동
  • 사용법
    1
    2
    
    int b = 0110 1010;
    printf("%d",b<<2);
    

        0110 1010
    0110 1010 «2칸 왼쪽으로 이동
    결과: 1010 1000

    • 밖으로 나간 비트는 제거, 비어있는 부분은 0으로 채워짐

2) »

  • 비트 전체를 오른쪽으로 이동
  • <<와 반대

8. 간접연산자 (*)

  • 포인터에 사용하는 연산자
  • 아직 포인터를 배우지 않았음으로 대충 이해한대로 정리하자면
  • ‘*변수’의 주소 내용을 참조
  • 사용법 참조
    1
    2
    3
    4
    5
    
    int *ptr;
    int num = 10;
    ptr = num;
    
    printf("%d",*ptr);
    

    결과: 10

9. 주소연산자 (&)

  • 변수의 주소를 알려주는 연산자
  • 변수마다 고유의 주소를 가지고 있음 ⇒ 주소만으로 특정 변수를 알 수 있음(컴퓨터가)
  • 사용법
    1
    2
    3
    4
    5
    
    int x = 5;
    scanf("%d\n",&x); // scanf("포맷", 변수 주소);
    
    int arr[3] = {1, 2, 3};
    scanf("%d",arr);
    

    결과
    5
    arr`address

    • scanf() : 변수주소를 사용하지 않으면 에러!
    • 인덱스 미지정 배열 출력 결과 : 변수의 주소

10. 형변환연산자 ( (변환할 타입) )

  • 명시적 형변환
    정확히 어떤 데이터타입으로 변할지 지정해 주는 것
    묵시적 형변환
    1
    2
    
    int x = 5;
    float y = x; // int가 암묵적으로 float로 변경됨
    
  • 사용법
    1
    2
    
    int x = 5;
    float y = (float)x; //int를 float로 지정
    
  • 형변환 시 주의할 점
    • 작은 타입 » 큰 타입 (괜찮음)
    • 큰 타입 » 작은 타입 (결과가 달라질 수 있음)
      • int x = (int)3.1;   » x = 3
    • 연산자의 우선순위에 의해 결과가 달라질 수 있음
      • ( float ) 100 / 3 = 33.3333333
      • ( float ) ( 100 / 3 ) = 33.0000000

11. 삼항연산자 (조건 ? 참 : 거짓;)

  • 세 개의 항으로 이루어진 연산자
  • 사용법
    1
    2
    
    // ( 조건 ) ? 참 : 거짓;
    (3 == 4) ? printf("True") : printf("False");
    

    결과 : False

12. 괄호연산자 ( (), [], {} )

  • 우선순위가 가장 높은 연산자
  • 우선순위를 잘 모르겠다면 괄호로 순서를 정하는것도 좋음
This post is licensed under CC BY 4.0 by the author.

C언어 공부 정리(1/10) + 추가

C언어 공부 정리(2/10)-제어문

Comments powered by Disqus.