본문 바로가기

c++

2일차(2023/02/18)-연산자

연산자를 시작하기에 앞서..

//자료형에 관한 지난시간 추가 내용

만약 두가지 자료형의 피연산자가 연산될 경우, 아래 첫줄 코드처럼

되도록이면 명시적으로 자료형을 변환해주자. 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