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

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


연산자 우선순위과 결합 법칙

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;

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 의 결과는 다르다.
      • && 의 우선순위가 더 높기 때문에

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

  • A && 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


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기