C++ Chapter 3.1 : 연산자 종류 정리
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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 증가시킴
- 이런건 쓰지 말기 !!!
- add(x, ++x)
- 컴파일러에서 두 파라미터 중 x를 먼저 연산할지 ++x를 먼저 연산할지 헷갈려함
- x = x++
- 이런것도 쓰지 말기
- add(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 z = (x++ , y++);
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.001d2
= 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이다.
- 0이 아닌 모든 것은
- 이항 연산자
&&
: 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이다.
- C++에서 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
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기