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 의 결과는 다르다.
■ && 의 우선순위가 더 높기 때문에
논리 연산시 주의사항 && 와 || 의 차이
- 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
728x90
300x250
LIST
'C │ C++ │ C# > C++' 카테고리의 다른 글
C++ Chapter 3.3 : 비트끼리의 연산, 비트 플래그, 비트 마스크 (0) | 2023.08.17 |
---|---|
C++ Chapter 3.2 : 이진수 (0) | 2023.08.17 |
C++ Chapter 2.7 : 리터럴 상수, 심볼릭 상수 (0) | 2023.08.16 |
C++ Chapter 2.6 : 문자형 char type (0) | 2023.08.15 |
C++ Chapter 2.5 : Boolean 자료형과 조건문 if (0) | 2023.08.15 |