프로그래밍/C++

연산자

GSW 2019. 1. 5. 16:38
반응형

컴퓨터의 가장 중요한 능력은 계산능력이다. 계산을 위해 C++에서 사용되는 식과 연산자를 알아보겠다. 식은 간단하게 평소에 쓰는 수식을 생각하면 된다. 1+2을 예로 들면 연산자 +와 피연산자 1과 2가 있다. 여기서 1+2를 식(expression)이라고 부르고 이 식의 결과값을 평가(evaluation)라고 부른다. 식 1+2를 출력해보면 1+2가 그대로 출력되는 것이 아니라 1+2의 평가값인 3이 출력되는 것을 알 수 있다. 식은 출력될 때 평가를 거친 후에 출력되는 것이다. 
#include <iostream>

int main()
{
    std::cout<<1+2<<std::endl;    //식의 평가값인 3출력

    return 0;
}

 C++에는 기본적인 사칙연산에 사용되는 +, -, *, / 말고도 다양한 연산자가 있다. 주로 사용하는 연산자를 표로 나타내보면 다음과 같다. 

  여기서 피연산자의 개수는 연산자가 사용된 식의 평가를 위해서 사용되는 피연산자의 개수이다. +(더하기)를 예로들면 1+2에서 1과 2 각각이 피연산자로 2개가 필요하다. 또한 같은 기호인데 피연산자의 개수에 따라 역할이 다르다는 것을 알 수 있다. 다시 +를 예로들면 피연산자가 하나일 때는 단항+, 두개일 때는 더하기임을 알 수 있다. 

 주로 사용되는(특히 for문과 같이 사용) ++와 --에 대해서 살펴볼만한 것이 있다. 바로 전위와 후위에 관한 내용이다. ++,-- 연산자는 다음과 같이 두 가지 형태로 쓸 수 있다.

++a    //전위 증가 연산자
a++    //후위 증가 연산자
--b    //전위 감소 연산자
b--    //후위 감소 연산자

 전위와 후위 모두 값을 1 증가시키거나 1감소시키는 것은 같지만 이것을 변수에 대입할 때는 실행 결과가 달라질 수 있다. 전위 연산자는 대입하기 전에 값을 증가/감소 시키고 후위 연산자는 대입한 후에 값을 증가/감소 시킨다.

a=++b    //b의 값을 1 증가시킨 후 a에 대입, 전위
a=--b    //b의 값을 1 감소시킨 후 a에 대입, 전위
a=b++    //b의 값을 a에 대입한 후 b의 값을 1 증가, 후위
a=b--    //b의 값을 a에 대입한 후 b의 값을 1 감소, 후위

 그 다음으로 살펴볼만한 것은 복합연산자이다. 복합연산자는 =(대입)연산자와 다른 연산자를 함께 사용한다. 다시 +를 예로 들면 =와 함께 사용해서 +=의 형태로 사용한다. 

a+=b    //a와 b를 더한 후 a에 대입
a-=b    //a에서 b를 뺀 후 a에 대입
a*=b    //a와 b를 곱한 후 a에 대입
a/=b    //a를 b로 나눈 후 a에 대입
a%=b    //a를 b로 나눈 나머지를 a에 대입

 이 복합연산자들(a☆=b, ☆은 일반 연산자)은 풀어쓰면 a=a☆b의 형태로 나타낼 수 있고 의미또한 같다. 

 마지막으로 연산자 우선 순위를 알아보자. 일상생활에서 사용하는 사칙연산 또한 우선순위가 있듯이 C++에서 사용하는 연산자들도 우선순위가 있다. 연산자들의 우선순위를 표로 나타내면 다음과 같다.

출처: https://ko.cppreference.com/w/cpp/language/operator_precedence

 우선순위가 낮은 연산자의 평가를 먼저 하고 싶다면 수식에서 사용하는 것과 마찬가지로 괄호로 묶어주면 된다. 같은 우선순위를 가지는 연산자를 동시에 사용하면 결합방향에 따라서 순서가 정해지게 된다. 우→좌일 경우 오른쪽부터 순서대로 평가되고 좌→우일 경우 왼쪽부터 순서대로 평가된다.

(a+b)*c    //*보다 우선순위가 낮은 +를 괄호를 이용해 먼저 평가
a+b+c    //a+b가 먼저 평가되고 (a+b)+c가 평가됨, 좌→우
a=b=c    //b=c가 먼저 평가되고 a=(b=c)가 평가됨, 우→좌

'프로그래밍 > C++' 카테고리의 다른 글

반복문  (0) 2019.02.02
조건식과 조건문  (0) 2019.01.23
데이터와 변수  (0) 2018.12.29
이스케이프 시퀀스  (0) 2018.12.27
cout을 이용한 출력  (0) 2018.12.08