연산자를 시작하기에 앞서..
//자료형에 관한 지난시간 추가 내용
만약 두가지 자료형의 피연산자가 연산될 경우, 아래 첫줄 코드처럼
되도록이면 명시적으로 자료형을 변환해주자. ex)(float) 20;
명시적으로 형변환을 하지 않아도 자동으로 형변환 되긴 하지만, 의도치 않은 결과가 저장될 수 있으므로,
원하는 자료형으로 명시적 변환을 해주는게 좋다.
float f=10.2415r+(float)20;
//소수 뒤에 f 붙이면 -> 4byte짜리 float 자료형
//붙이지 않으면 -> 8byte짜리 double 자료형으로 인식
int k=30+3.141592;
//명시적으로 형 변환하지 않았지만, k가 int형으로 선언->k=33 정수형으로 계산됨.
연산자는 우선순위가 존재하므로 이를 잘 고려해야 한다.
<<연산자의 종류>>
1)산술 연산자
: +(더하기), -(빼기), *(곱하기), /(나누기), %(모듈러스, 나머지연산자), ++(1증가), --(1감소)
덧셈, 뻴샘, 곱셈은 특이사항이 없다. 아래 코드와 같이 연산이 이루어진다.
int main(void)
{
int data;
float f;
//덧셈, 뺄셈, 곱셈
data=10+10;
data+=20; //data=data+20;과 같음.
data-=10; //data=data-10;과 같음.
data=data*2;
data*=1; //data=data*1;과 같음.
return 0;
}
하지만 나눗셈의 경우는 2가지 case로 나뉜다.
case 1) 정수끼리의 나눗셈 -> 나머지를 버린다.(소수점 이하 버림, 데이터 손실)
case 2) 실수끼리의 나눗셈 ->나머지라는 개념 없이 그냥 소수점까지 계산 결과 도출
따라서 몫만 남기는 계산을 하고 싶다면, 피연산자를 모두 정수형으로 형변환한다.
모듈러스(나머지 구하기)연산에서 주의해야 할 점은, 피연산자가 모두 정수형이어야 한다.
아니면 오류가 난다. 그 이유는 실수끼리의 나눗셈은 나머지 개념이 없기 때문에 그렇다.
(int)3/(int2)에서는 몫이 1, 나머지가 1인 개념이라면
(float)3/(float2)에서는 그냥 결과값이 (float)1.5인 것이다.
//나눗셈
data=10/3; //data=3, 데이터 손실이 일어남.
f=10.5/(float)3; //데이터 손실 일어나지 않음.
//모듈러스, 나머지 연산
data =10%3; //data=1;
f=10.5%(float)3; //error->나머지 존재 x이기 때문.
전위, 후위 연산자(++, --)에 대해 주의할 점은 연산자의 우선순위이다.
피연산자 앞에 붙이면, 대입 연산자(=)보다 우선순위가 빠르고, 뒤에 붙이면 대입연산자보다 우선순위가 느리다.
따라서 아래 코드와 같이 저장되는 변수 값에 차이가 생기므로 이를 주의하여 목적에 맞게 잘 써야한다.
아, 그리고 전위 후위연산자는 나머지 연산자들과는 다르게 대입연산자(=)표시가 없어도 해당 피연산자의 값이 연산된 값으로 저장된다는 것을 알아둬야 한다.
int data;
int value=30;
data=++value;// 1순위)++ 2순위)=, data=31
data=value++;// 1순위)= 2순위)++, data=30
//data에 30이 대입된 후 1이 더해지므로 data=30이고, value=31이 된다.
2)논리 연산자: !(반전), &&(논리곱), ||(논리합)
True(참)와 False(거짓)로 결과를 도출한다.
컴퓨터는 0을 False로 인식하고 그 외의 양수를 True로 인식한다.
보편적으로 False=0, True=1로 본다.
!(반전): 참을 거짓으로 뒤집음. ex) !1 ->0, !200 ->0, !0 ->1
&&(논리곱): 둘 다 참이어야지 참. ex) 100&&200 ->True, 0&&1 ->False
||(논리합): 둘 중 하나라도 참이면 참. ex) 0&&200 ->True
*bool 자료형: 정수타입 자료형으로 논리 연산을 위해 만든 자료형이므로 0, 1로만 값을 받아들인다.
bool truefalse=100&&200;//truefalse=1;(참)
bool truefalse=0&100;//truefalse=0;(거짓)
3)비교 연산자
말 그대로 두 피연산자를 비교하는 연산자. 결과값을 True, False로 도출한다.
==(같다), !=(같지 않다), <(작다), >(크다), <=(작거나 같다), >=(크거나 같다)
##내용 요약 코드##
int main(void)
{
//정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현 방식의 피 연산자가 연산될 경우 명시적으로 변환하자.
float f = 10.2415f + (float)20;//적어주지 않아도 변환은 일어남.(연산 결과 자료형이 float이니까.)
//소수 뒤에 f 붙이면 4byte float으로 보겠다.
//붙이지 않으면 4byte double로 보겠다.-> ex)0.1f; -> float, 0.1; -> double
//operator(연산자)
//연산자의 우선순위가 존재
//산술 연산자: + - * / %(모듈러스, 나머지 연산자, 피연산자가 모두 정수여야 함) ++ --
int data = 10 + 10; //data=data+20과 data+=20은 같음
data = 10 / 3;
//정수끼리의 나눗셈-> 나머지 버림(소수점 이하 버림)
//실수끼리의 나눗셈-> 나머지 존재 x, 따라서 data=10.0 % 3.0 -> 오류남.
//++ -- 전위, 후위 연산자
++data;//모든 연산자 순위 통틀어서 가장 빠름.
data ++;//모든 연산자 순위 통틀어서 가장 마지막, 대입 연산자보다 늦음.
a = 10; data = a++;//data=10이다. 전위연산자라면 data=11이 되었을 것.
//연산자는 되도록이면 전위로 쓰자.
//덧셈은 자신의 값이 증가하려면 +=을 해줘야 하지만, ++ --는 대입 연산자 없이도 변수 스스로 연산된 값이 저장됨.
//논리 연산자: !(반전), &&(논리곱), ||(논리합)
//참(0 외의 값/주로 1, true) 거짓(0, false)
bool truefalse = true;//bool은 정수타입, 0과 1로만 받아들임.
bool IsTrue = 100;//true, 1로 받아들임, 정수형 자료형으로 쓰는건 안됨. (1byte)
IsTrue = true;
IsTrue = !IsTrue;//0이 아닌 수(참으로 인식)에 !붙이면 다 0이 됨.
bool iTrue = 100 && 200;//True, 연산의 결과 = 1, 0&&100이면, 연산 결과 = 0
iTrue = 0 || 0; //연산 결과 = 0, 100 || 0이면, 연산 결과 = 1
//즉, 0이 아닌 숫자는 무조건 참.
//비교 연산자, 참과 거짓으로 결과 도출
//==, !=, <, >, <=, >=
//<<다음시간에 배울 것>>
//삼항 연산자
//:?
//구문
//if, else
//switch case
return 0;
}
'c++' 카테고리의 다른 글
1일차(2023/02/14)-자료형 (0) | 2023.02.14 |
---|