본문 바로가기
C │ C++ │ C#/C++

C++ Chapter 3.1 : 연산자 종류 정리

by Pokaa 2023. 8. 16.
728x90
728x90
SMALL
연산자 우선순위과 결합 법칙

 

 left to right  : 우선 순위 같을 경우 왼쪽부터

 right to left  : 우선 순위 같을 경우 오른쪽부터

  • =, +=, -= ,…
  • 우선 순위를 다 외울 수가 없으니까 우선 순위 높은건 그냥 괄호로 묶어 주기 !

 

산술 연산자

 

  • 더하기, 곱셈, 나누기, 빼기
int x = 7;
int y = 5;

cout << x / y << endl;  // 1  int
cout << float(x) / y << endl; // 1.75  float
cout << x / float(y) << endl;  // 1.75  float
cout << float(x) / float(y) << endl;  // 1.75  float
  • 단항 연산자는 숫자와 딱 붙여쓰는걸 추천한다.
    ο - 1 로 써도 컴파일이 되지만 읽는 사람 입장에서 잘못 볼 수 있으므로
    ο -1 라고 딱 붙여 써주기

 

증감 연산자


 ++x  : 바로, 즉시 x를 1 증가시킴

 x++  : 세미콜론 ; 을 만난 후에 x를 1 증가시킴

  • 이런건 쓰지 말기 !!!
    1. add$($x, ++x$)$
        ■ 컴파일러에서 두 파라미터 중 x를 먼저 연산할지 ++x를 먼저 연산할지 헷갈려함
    2. x = x++
        ■ 이런것도 쓰지 말기

 

sizeof 연산자

 

  •  sizeof 도 연산자다. 함수 아님 !
  • 데이터 타입이나 변수의 크기를 리턴한다. 몇 byte인지.
float a;

sizeof(float);
sizeof(a);
sizeof a;

 

, 쉼표 연산자


1. 구분 기호로서의 ,

int x = 3, y = 2 // 여기서의 쉼표는 구분기호! 연산자 아님.
  • 여기서의 쉼표는 구분기호! 연산자 아님.
  • y 도 int 라는 구분 기호.


2. 연산자로서의 ,

int x = 3;
int y = 10;

int z = (x++ **,** y++);  // z는 10이 된다.
z = x, y // z는 4가 된다.
  • 위 코드에서의 쉼표는 연산자로서의 콤마이다.
  • 콤마는 = 보다 연산자 우선순위가 낮다.
    ο int z = $($x++ , y++$)$;
        ■ 괄호로 묶어주었기 때문에  부터 실행된다.
            ■ x++ 를 지나 y++ 값만 z에 대입되게 된다.
        ■  는  와 비슷한 역할이라고 보면 된다. 다만  보다 연산자 우선순위가 낮음
    ο z = x, y
        ■ 콤마가 = 보다 연산순위가 낮기 떄문에 = 먼저 실행된다.
        ■ 따라서 x 값만 z에 들어가게 된다.
        ■ $($ z = x $)$ , y 가 되는 것과 마찬가지다.
        ■ y는 그냥 덩그러니..
        ■ z = $($x , y$)$ 라고 해주어야 y 값이 z에 대입될 것이다.
int x = 3;
int y = 10;

int z = x **,** y;  // error !
  • int z = x , y; 에서의 콤마는 구분기호이기 떄문에 (int z = int x) , int y 인거나 마찬가지다.
    ο int y 는 이미 위에 선언 되있으니까 중복 선언이라고 에러가 나는 것.

 

조건 연산자

 

  • 유일한  삼항 연산자 
    ο 나중에 또 삼항 연산자가 새로운 문법으로 나올 수도 있는 것이므로 조건 연산자라고 부를것.
bool onSale = true;
int price = 0;
    
price = (onSale == true) ? 10 : 100;
bool onSale = true;
int price = 0;

price = (onSale == true) ? 10 : 100;
bool onSale = true;
int price = 0;

if (onSale)
	price = 10;
else
	price = 100;
  • 좌 우 두 코드는 같은 코드나 마찬가지다.
    ο onSale 값이 ture면 price에 10을 대입, false면 price에 100을 대입.
  • price = $($onSale == true$)$ ? 10 : 100;
    ο price = $($ $($onSale == true$)$ ? 10 : 100 $)$ ; 이나 마찬가지다. 10이나 100이 price에 들어감
  •  조건식 ? A : B 
    ο 참이면 A, 거짓이면 B
    ο A와 B는 데이터 타입을 맞추는게 좋다.
        ■ “10” : 100 비추
cout << ( x % 2 == 0 ) ? "even" : "odd" << endl; // error
  • 조건 연산자는 « 보다 우선순위가 낮다.
    ο 따라서 $($ cout « $($ x % 2 == 0 $)$ $)$ ? “even” : “odd” 꼴이 되버리기 떄문에 에러 !
  • if-else 와 삼항 연산자의 차이점
    ο 삼항 연산자는 const를 쓸 수 있다.
bool onSale = true;
    
**const int** price = (onSale == true) ? 10 : 100;
  •  삼항 연산자 는 const 상수를 쓸 수 있다. 참인 값인 10이 price의 상수 리터럴로 대입될 것.
bool onSale = true;

if (onSale)
	const int price = 10;
else
	const int price = 100;

cout << price << endl; // 에러 !!!
  •  if-else문  안에서의 변수 선언은 지역변수다.
    ο const int price는 if-else문을 벗어나면 사라진다.
    ο 그래서 if-else문으로 const int 값을 정하기는 어려움
    ο 밖에서 선언한 후에 if-else문에 들어오면 이미 한번 정한거니 값 못바꾸니까.
  • 그래도  if-else  가 가독성이 더 좋긴하다.

관계 연산자

 

  •  ==  !=  <=  >= 
  • 두 피연산자의 관계를 다루며
  • 결과 값은  boolean  타입이다.


실수인 두 피연산자 크기 비교 연산시 주의할 점

 

double d1 (100 - 99.99); // 0.001
double d2 (10 - 9.99); // 0.001

if (d1 == d2)
cout << "equal" << endl;
else{
cout << "Not equal" << endl;
if (d1 > d2) 
cout << "d1 > d2" << endl;
else 
cout << "d1 < d2" << endl;
  • 결과는 “Not equal” , “d1 > d2” 이다.
    ο  d1  = 100 - 99.99 = 0.001
    ο  d2  = 10 - 9.99 = 0.001
    ο d1과 d2는 값이 같음에도 같지 않다고 나온다.
        ■ 이진수 소수가 아닌 이상 컴퓨터는 딱 떨어지는 십진수 소수를 구현할 수 없기 떄문이다.
            ■ 최대한 이진수의 조합들로 십진수에 가깝게 만드는것.
            ■ 컴퓨터는 이진수로 저장하기 떄문에.
            ■  d1-d2  = 5.32901e - 15
                ■ 따라서 컴퓨터 내부상으로 이정도 오차가 있음


이 정도 오차면 두 피연산자를 같다고 가정하자고 엡실론 값을 설정하기

 

double d1 (100 - 99.99); // 0.001
double d2 (10 - 9.99); // 0.001

const double **epsilon** = 1e - 10;

if (std::abs(d1 - d2) < epsilon)
	cout << "Approximattely qual" << endl;
else
	cout << "Not equal" << endl;
  • 엡실론 값은 프로젝트에 따라 개발자가 임의로 정하는거고
  • std::abs$($d1 - d2$)$ < epsilon
  • 이정도 값의 오차면 두 소수 피연산자가 equal 하다고 보자고 설정하는것.

 

논리 연산자

 

  • 결과 값은  boolean  타입이다.
  • 단항 연산자
    ο  : NOT
        ■ 0이 아닌 모든 것은  ture 
        ■ 오로지 0만  false 
        ■ x = 5 라면 !x 의 결과값은 false이다.
  • 이항 연산자
    ο  &&  : AND
    ο  ||  : OR
  • 게임에서 쓴다면 아래와 같은 느낌
bool hit = true;
int health = 10;

if (hit == ture && health < 20) // hit이 true이고 health가 20보다 작다면
{
	cout << "die" << endl;
}
else 
	helath -= 20;


논리 연산자끼리의 우선 순위

 

  •  !  &&  || 
    ο  !x == y  와  !$($x == y$)$  의 결과는 다르다.
    ο  A || B && C  와  $($ A || B $)$ && C  의 결과는 다르다.
        ■  &&  의 우선순위가 더 높기 때문에


논리 연산시 주의사항 && 와 || 의 차이

 

  • &&  B
    ο A가 거짓이면 B는 연산하지 않는다.
    ο A가 거짓이면 B는 연산할 필요도 없이 결과는 false기 때문이다.
    ο 이 원리를 개발자가 의도적으로 이용할 수도 있다.
int x = 2;
int y = 2;

if (x == 1 && y++ == 2)
{
	...
}

cout << y << endl;  
// 2가 출력된다. x==1 에서 false가 되어 y++은 연산하지도 않았기 때문이다.


드모르간 법칙

 

  •  ! $($ a && b $)$ 와 !a || !b  는 같다.
  •  ! $($ a && b $)$ 와 !a && !b  는 같지 않다.


XOR

 

  • false  XOR  false → false
  • false  XOR  true → true
  • true  XOR  false → true
  • true  XOR  true → false
  • 두 피연산자의 boolean 값이 다를 때만 true
    ο C++에서 XOR 연산자는 없다.
        ■  if $($ x ! = y $)$  로 표현 함. 다를 떄 true 라면.
    ο  는 비트 연산자로서의 XOR이다.


연습 문제

 

  • true  &&  true  ||  false
    ο → true
  • false  &&  true  ||  false
    ο → true
  • false  &&  true  ||  false  ||  true
    ο → true
  • $($ 14 > 13  ||  2 > 1 $)$  &&  $($ 9 > 1 $)$
    ο → true
  • ! $($ 2314123 > 2  ||  123123 > 2387 $)$
    ο → false
728x90
300x250
LIST