코딩 공부/C, C++

3. 연산자

갬성꿈돌이 2024. 1. 17. 01:27
반응형
반응형

목차

     

    C언어에서의 연산자(operator)는 기존 수학에서 사용하는 연산자와는 뜻도, 기능도 약간 다르다.

     

    가장 기초가 되는 내용부터 알아보자.

     

    1. =(대입연산자)

    a=b 는 a에 b의 값을 넣으라는 뜻이지 양쪽이 같다는 뜻이 아니다. 절대!!!! 착각하지 말자.

     

    2. 피연산자란 연산을 당하는입장으로 {10}을 2로 나눈다에서는 10이 피연산자이다.

     

    3. 대부분의 연산자는 왼쪽에서 부터 오른쪽으로( →) 연산을 시작한다.

     

     

     

     

    산술연산자

     

    + 왼쪽의 피연산자에 오른쪽의 피연산자를 더함.
    - 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌.
    * 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함.
    / 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔.
    % (모듈러스,나머지) 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함.
    실수의 경우 나머지를 만들 수 없어 오로지 정수만 사용.

     

     

     

    예시를 들어보자. 아래 연산들은 int data = 0;으로 선언했다고 가정한다. 

    나누기 연산
    정수의 연산 실수의 연산 정수+실수의 연산
    data = 10/ 3; data = 10. / 3. ; data = 10 / 3. ;
    실행결과 : 3. 실행결과 :
    기존에 자료형을 int로 명시했기에 컴퓨터가 int로 형변환 하여 실수를 정수로 바꿔 계산. 실행은 되지만 아래 사진처럼 오류 코드를 발생시킴. 이를 해결하려면 data = (int)(10. / 3. ); 으로 변경해주면 됨.
    실행결과 : 실수의 연산와 같음

     

    나누기 연산 중 실수의 연산

     

     

     

    % 모듈러스 연산
    정수의 연산 실수의 연산 정수+실수의 연산
    data = 10 % 3 ; data = 10. % 3. ; data = 10 % 3. ;
    실행결과 : 1 실행결과 : 실행불가.
    아래 사진처럼 오류만 뜸.
    실행결과  : 실수의 연산과 동일

     

    모듈려스 연산은 정수만 가능

     

     

     

     

     

     

    증감연산자

     

     

    증감연산자는 일반적인 수학 개념인 1이 증감하는 것으로 보면 안되고 다음 단계로 증감으로 이해해야한다.  기본 증감연산자 ++(한 단계 증가), --(한 단계 감소)를 통해 알아보자.

    int data2 = 0;
    ++data2;
    printf("data2는 %d\n", data2);

     

    기본 증감연산자 실행 결과

     

    위의 내용만 보면 그냥 1이 증가한거 아니야?라고 생각할 수 있지만 전혀 아니다. 일반적인 정수형 숫자에서는 다음 단계로 증감하기 위한 단위가 1이기 때문에 1이 증감하는 것으로 되겠지만 포인터를 배우다보면 피연산자가 누구냐에 따라 한 단계라는 개념이 변화(ex : a에게는 한 단계의 단위는 10씩 증감하는 것이다.)하기 때문에 단계의 증감으로 이해하자. 

     

     

     

    전위와 후위

     

     

    연산자를 앞에 쓰냐, 뒤에 쓰냐에 따라 전위와 후위라고 한다.

    후위 연산자로 사용하는 경우 연산자 우선순위가 가장 나중으로 밀리기 때문에 특별히 구분지어야하는 상황이 아니라면 증감연산자는 전위를 사용하자!!! 또한 후위 증감 연산을 할 경우에는 오퍼레이터에서 효율이 안좋은 함수를 호출할 가능성이 있다.

     

    data = 0; //기본형

    ++data; // 전위(전치)

    data++; // 후위(후치)

     

    후위 전위
    data = 0;
    a = 10;
    data = a++;
    data = 0;
    a = 10;
    data = ++a;
    a의 값을 넣고 증가하기에 data = 10이 된다. 증가 후 a의 값을 넣기에 data = 11이 된다.
    결론 : 후위로 넣으면 가장 마지막으로 수행되기에 원하는 결과가 나오지 않을 수도 있다.

     

     

    int data3 = 0;
    int a1 = 10;
    data3 = a1++;
    printf("data3는 %d\n", data3);
    
    int data4 = 0;
    int a2 = 10;
    data4 = ++a2;
    printf("data4는 %d\n", data4);

     

     

     

     

     

    +) 추가

     

    +=는 변수 자체의 값이 증가하는 것이 아닌 한 변수의 값을 다른 변수 결합하여 대입하는 것인데 ++은 변수 자체의 값을 실제로 증가시킨다.

     

    += 연산자는 더하기 연산을 수행하고 결과 값을 연산자의 왼쪽 변수에 할당한다. 반면에 =+ 연산자는 변수에 값을 추가하기 전에 할당 연산을 수행하는데 이는 C++에서 일반적으로 사용되지 않는다.

     

     

     

     

     

    논리연산자

     

     

    논리연산자는 참/거짓의 판단을 통해 0과 1만 출력함. 논리연산자는 구문(if-else, switch-case), 삼항연산자와 함께 섞여서 많이 사용됨. 논리연산자에서의 참/거짓은 아래와 같음.

     

    참(true) : 0이 아닌 모든 값을 말하는데 컴퓨터는 보통 1로 출력함.

    거짓(false) : 0

     

    예시)

    int truefalse = true; 를 하면 1이 되고 int truefalse = false; 를 하면 0이 됨.

    iTrue = 100 && 200; 을 하면 양쪽 다 0이 아니기에 참으로 되어 iTrue는 1이 됨.

     

    +) bool 자료형

    bool IsTrue = 100;을 넣으면 0인지 아닌지만 봐서 IsTrue가 1이 됨.

    IsTrue = True;

    IsTrue = !IsTrue;를 하면 결과적으로 False가 됨.

     

    +) int 자료형

    int iTrue =0;

    iTrue = !iTrue;를 하면 결과적으로 1이 됨.

     

     

     

     

     

     

     

    비교연산자

     

    얘도 논리연산자처럼 True(참, 1)/False(거짓, 0) 값만 나온다.

     

    == 양쪽이 같냐고 물어봤을 때 같으면 True.

    != 양쪽이 다르냐고 물어봤을 때 다르면 True.

    <= 오른쪽이 더 크거나 같냐고 물어봤을 때 맞으면 True.

    >= 왼쪽이 더 크거나 같냐고 물어봤을 때 맞으면 True.

     

     

     

    연산자의 우선순위

     

     

    연산자 간에는 우선순위 라는 것이 있어 컴퓨터가 무엇을 먼저 처리할지에 대한 처리 순서를 결정하기 때문에 우리가 그냥 수학문제 풀듯이 풀면 안된다.

     

     

    int data = 10 + 10; 더하기 먼저 계산후 대입. 

     

    데이터에 20을 더한 값을 다시 데이터에 대입을 하기 위한 방법은 2가지가 있다.

    1. data = data + 20;

    2. data += 20;

    일반적인 수학 계산으로는 왼쪽에서 오른쪽으로 계산이 진행되니 오류가 날 것 같은데 신기하게도 두 코드가 동일한 결과값을 나타낸다. +가 =보다 우선순위가 높기 때문에 먼저 처리하는 것이다! 다시 한번 말하지만 수학문제 풀듯이 생각하면 안된다!

     

     

     

     

     

     

    C언어 연산자의 우선순위표

    우선순위 연산자 설명 결합 방향
    1 ++ 후위 증가 연산자 왼쪽에서 오른쪽으로
      -- 후위 감소 연산자 왼쪽에서 오른쪽으로
      () 함수 호출 왼쪽에서 오른쪽으로
      [] 첨자 연산자 왼쪽에서 오른쪽으로
      . 참조에 의한 선택 왼쪽에서 오른쪽으로
      -> 포인터를 통한 선택 왼쪽에서 오른쪽으로
    2 ! 논리 NOT 연산자 오른쪽에서 왼쪽으로
      ~ 비트 NOT 연산자 오른쪽에서 왼쪽으로
      + 양의 부호 (단항 연산자) 오른쪽에서 왼쪽으로
      - 음의 부호 (단항 연산자) 오른쪽에서 왼쪽으로
      ++ 전위 증가 연산자 오른쪽에서 왼쪽으로
      -- 전위 감소 연산자 오른쪽에서 왼쪽으로
      (타입) 타입 캐스트 연산자 오른쪽에서 왼쪽으로
      * 참조 연산자 (단항 연산자) 오른쪽에서 왼쪽으로
      & 주소 연산자 (단항 연산자) 오른쪽에서 왼쪽으로
      sizeof 크기 오른쪽에서 왼쪽으로
    3 * 곱셈 연산자 왼쪽에서 오른쪽으로
      / 나눗셈 연산자 왼쪽에서 오른쪽으로
      % 나머지 연산자 왼쪽에서 오른쪽으로
    4 + 덧셈 연산자 (이항 연산자) 왼쪽에서 오른쪽으로
      - 뺄셈 연산자 (이항 연산자) 왼쪽에서 오른쪽으로
    5 << 비트 왼쪽 시프트 연산자 왼쪽에서 오른쪽으로
      >> 부호 비트를 확장하면서 비트 오른쪽 시프트 왼쪽에서 오른쪽으로
    6 < 관계 연산자(보다 작은) 왼쪽에서 오른쪽으로
      <= 관계 연산자(보다 작거나 같은) 왼쪽에서 오른쪽으로
      > 관계 연산자(보다 큰) 왼쪽에서 오른쪽으로
      >= 관계 연산자(보다 크거나 같은) 왼쪽에서 오른쪽으로
    7 == 관계 연산자(와 같은) 왼쪽에서 오른쪽으로
      != 관계 연산자(와 같지 않은) 왼쪽에서 오른쪽으로
    8 & 비트 AND 연산자 왼쪽에서 오른쪽으로
    9 ^ 비트 XOR 연산자 왼쪽에서 오른쪽으로
    10 | 비트 OR 연산자 왼쪽에서 오른쪽으로
    11 && 논리 AND 연산자 왼쪽에서 오른쪽으로
    12 || 논리 OR 연산자 왼쪽에서 오른쪽으로
    13 ? : 삼항 조건 연산자 오른쪽에서 왼쪽으로
    14 = 대입 연산자 및 복합 대입 연산자
    (=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)
    오른쪽에서 왼쪽으로
    15 , 쉼표 연산자 왼쪽에서 오른쪽으로

     

    위의 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행됩니다.

    또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 결합 순서에 따라 실행 순서가 결정됩니다.

     

    https://tcpschool.com/c/c_operator_arithmetic

     

    코딩교육 티씨피스쿨

    4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

    tcpschool.com

     

    반응형

    '코딩 공부 > C, C++' 카테고리의 다른 글

    6. 함수와 변수  (1) 2024.01.23
    5. define과 비트연산자  (0) 2024.01.19
    4. 조건문  (0) 2024.01.17
    2. 자료형  (0) 2024.01.17
    1. C언어 기초  (0) 2024.01.16