표현식 정의
표현식이란 값을 나타내는 표현이다. 이때 값은 숫자 뿐만 아니라 문자열도 해당되며 이들을 나타내는 식을 표현식이라고 한다. 표현식은 피연산자와 연산자로 구성되어 하나의 값을 나타낸다. 표현식에는 피연산자와 연산자가 반드시 모두 포함될 필요는 없다.
- 피연산자(Operand): 데이터 표현 자체(리터럴) 자체일 수도 있고 값이 저장된 변수일 수도 있다.
- 연산자(Operator): 연산을 수행하는 함수로, 기본적인 사칙연산자와 함수와 같은 값을 반환하는 서브프로그램도 포함된다.
표현식과 연산자
표현식에서 사용하는 연산자는 아주 다양하다. 그 중 대부분의 프로그래밍 언어에서 기본적으로 제공하는 연산자들에 대해서 알아보도록 하겠다.
산술 연산자 (Arithmetic Operators)
산술 연산자에는 기본적인 사칙연산 연산자가 포함되며 이외에도 다양한 산술 연산자가 존재한다. 다음은 C/C++에서 지원하는 산술 연산자이다.
연산자 | 의미 | 연산자 대비 피연산자 위치 |
+ | 덧셈 | 좌 & 우 |
- | 뺄셈 | 좌 & 우 |
* | 곱셈 | 좌 & 우 |
/ | 나눗셈 | 좌 & 우 |
% | 나머지 | 좌 & 우 |
++ (전위) | 1 증가 | 우 |
-- (전위) | 1 감소 | 우 |
++ (후위) | 값 사용 후 1 증가 | 좌 |
-- (후위) | 값 사용 후 1 감소 | 좌 |
+ (부호) | 부호 유지 | 우 |
- (부호) | 부호 반대로 | 우 |
>> | 오른쪽으로 비트 단위 시프트 | 좌 & 우 |
<< | 왼쪽으로 비트 단위 시프트 | 좌 & 우 |
하나의 피연산자가 필요한 연산자를 "단항 연산자(Unary Operator)", 두 개의 피연산자가 필요한 연산자를 "이항 연산자(Binary Operator)"라고 한다. 그리고 하나의 수식에 여러 연산자가 사용될 경우, 정해진 우선순위에 따라 연산을 수행하게 된다. 이를 "연산자 우선순위"라고 한다. C/C++의 산술 연산자 우선순위는 다음과 같다.
연산자 | 우선순위 | 결합 방향 |
++ (후위), -- (후위) | 1 | 좌결합 |
++ (전위), --(전위), + (부호), - (부호) | 2 | 우결합 |
*, /, % | 3 | 좌결합 |
+, - | 4 | 좌결합 |
>> , << | 5 | 좌결합 |
표현식에 포함된 피연산자들의 타입이 서로 일치하지 않는 경우, 타입 변환이 필요하다. 타입 변환은 주어진 타입의 값을 다른 타입의 값으로 변환하는 것이다. 타입 변환 방식에는 "묵시적 타입 변환"과 "명시적 타입 변환"이 있다.
- 묵시적 타입 변환: 프로그래밍 언어의 정책에 따라 컴파일러에 의해 자동으로 변환되는 방법
- 명시적 타입 변환: 프로그래머가 명시한 타입으로 변환하는 방법, 타입 캐스팅이라고도 한다.
관계 연산자
관계 연산자는 2개의 피연산자를 서로 비교하여 둘 사이의 관계가 관계 연산자와 일치하는지를 판별한다. 그렇기에 관계 연산의 결과는 참(True) 또는 거짓(False)이 된다. C/C++에서 제공하는 관계 연산자는 다음과 같다
연산자 | 의미 | 결합 방향 |
> | 보다 크다 | 좌 & 우 |
>= | 보다 크거나 같다 | 좌 & 우 |
== | 같다 | 좌 & 우 |
< | 보다 작다 | 좌 & 우 |
<= | 보다 작거나 같다 | 좌 & 우 |
!= | 다르다 | 좌 & 우 |
관계 연산의 우선순위와 결합 방향은 다음과 같다. 관계 연산자의 우선순위는 산술 연산자보다 낮다.
연산자 | 우선순위 | 결합 방향 |
>, >=, <, <= | 6 | 좌결합 |
==, != | 7 | 좌결합 |
타입 변환이 필요한 경우에는 산술 연산자에서와 동일하게 묵시적 타입 변환이나 명시적 타입 변환이 가능하다.
논리 연산자
논리곱 연산자, 논리합 연산자, 부정 연산자 등이 포함된다. 논리 연산자의 연산 결과는 모두 참 또는 거짓이 된다. C/C++에서 지원하는 논리 연산자는 다음과 같다.
연산자 | 의미 | 연산자 대비 피연산자 위치 |
&& | 논리곱 | 좌 & 우 |
|| | 논리합 | 좌 & 우 |
! | 부정 | 우 |
논리 연산자의 우선순위는 관계 연산자와 산술 연산자보다 낮다. 다만, 부정은 산술 연산자의 단항 연산자(++, -- 등)와 동일한 2순위를 가진다.
연산자 | 우선순위 | 연산자 대비 피연산자 위치 |
&& | 8 | 우결합 |
|| | 9 | 좌결합 |
! | 2 | 좌결합 |
논리 연산의 경우 단축 평가(Short-Circuit Evaluation)를 통해 모든 논리 연산을 수행하지 않고도 표현식의 값을 얻을 수 있다. (논리 연산에 대해서 공금하다면 여기를 참조하자.)
그 외의 연산자
C/C++에서 제공하는 그 외의 연산자로는 비트 단위 논리 연산자, 삼항 조건 연산자 등이 있다.