본문 바로가기

기타/글보관

(C) C언어의 연산자

C언어에는 기본으로 제공되는 연산자가 꽤 많다.

종류에는 대입 연산자, 산술 연산자, 변수에 저장된 값을 증감시키는 연산자, 관계 연산자, 논리 연산자, 콤마 연산자

등이 있다.

 

대입 연산자와 산술 연산자

두 종류의 피연산자를 합쳐서 '이항 연산자(binary operator)'라고 부른다.

 

  • = : 연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입한다.
  • + : 두 연산자의 값을 더한다.
  • - : 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다.
  • * : 두 연산자의 값을 곱한다.
  • / : 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다.
  • % : 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지 값을 반환한다.

 

글로된 설명만 보면 이해가 잘 되지않는다. 코드를 보자.

위와 같은 코드의 경우 함수의 호출보다 연산식이 먼저 진행되고, 그 결과가 인자가 되어 함수의 호출까지 이어진다.

이것도 말로만 하면 어려우니 그림을 보자.

 

복합 대입 연산자

연산자의 종류에는 일반 연산자도 있지만 다른 형태로 합쳐진 대입 연산자도 존재한다.

대입 연산자가 아닌 다른 연산자는 나중에 비트 연산자를 배우면 자연스럽게 알게 된다.

복합 대입 연산자에는

  *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

가 있다.

간단한 사용 예시는 다음의 코드를 보자.

위 코드와 주석을 보면 알다시피 아래와 같은 복합 대입 연산자의 규칙이 있다.

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 

여기서 주의해야할 점이 있다. 바로 복합 대입 연산자의 순서인데,

-=이 아니라 =-를 사용하면 아래와 같은 문제가 생긴다.

이외에 연산자와 피연산자 사이의 공백을 삽입하지 않아 후에 코드를 분석하는데 혼란을 줄 수 있다.

다음과 같이 부호 연산자를 사용할 때는 공백을 삽입하는 것이 혼란을 최소화 시킬 수 있다.

num1  =  -num2; //부호 연산자 사용
num1  -=  num2; //복합 대입 연산자 사용

 

변수에 저장된 값을 증감 시키는 연산자

일단 표부터 보자.

연산자 연산자의 기능 결합방향
++num 값을 1 증가 후, 속한 문장의 나머지를 진행한다.
num++ 속한 문장을 먼저 진행한 후, 값을 1 증가시킨다.
--num 값을 1 감소 후, 속한 문장의 나머지를 진행한다.
num-- 속한 문장을 먼저 진행한 후, 값을 1 감소시킨다.

위의 연산자는 앞으로 많이 쓰일 예정이니 확실히 알아가자.

앞에 연산자가 붙은 경우(++num, --num)에는 변수에 저장된 값에 변화를 주고나서, 문장의 나머지 부분을 실행한다.

반면, 뒤에 연산자가 붙은 경우에는 문장의 전체부분을 실행하고나서 변수에 저장된 값에 변화를 준다.

빠른 이해를 위해 아래의 코드를 보자.

6행에서 증가하기 전의 값이 출력되고 7행으로 넘어가면서 num1값에 1이 증가한다.

10행에서 먼저 num2값이 증가한 값이 출력되고 11행에서 이미 10행에서 증가한 num2값이 출력된다.

 

이해가 되었으면, 다음의 예시도 한번 보자.

6행에서 num1값은 문장의 연산을 다한뒤에 1값을 더했으므로 5 + 1 = 6. 즉 num1의 값은 6이다.

num2는 num1의 값이 1 더해지기전에 먼저 계산되므로 5 - 2 = 3. 즉, num2의 값은 3이다.

 

관계 연산자

둘의 값을 비교하는 역할을 하는 연산자이다. 비교 연산자라고도 한다.

연산자 연산자의 기능
< a < b, a의 값이 b값 보다 작은가
> a > b, a의 값이 b값 보다 큰가
== a == b, a의 값과 b값이 같은가
!= a != b, a의 값과 b의 값이 다른가
<= a <= b, a의 값이 b의 값보다 작거나 같은가
>= a >= b, a의 값이 b의 값보다 크거나 같은가

위의 연산을 바탕으로 조건을 만족하는지 만족못하는지에 따라 참값과 거짓값으로 나뉜다.

간단한 예시를 보자.

0 : 거짓

1 : 참

더 설명할 필요도 없이 간단하다.

 

논리 연산자

전기회로에서도 볼 수 있었던 AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자이다.

연산자 연산자의 기능
&& a && b, a와 b의 값이 모두 참이면 결과를 참으로 반환.
|| a || b, a와 b 중 하나라도 참이면 결과를 참으로 반환.
! !a, a가  참이면 거짓, a가 거짓이라하면 참을 반환.

주의해야할 점은 '관계 연산자가 논리 연산자보다 더 먼저 진행이 된다.' 는 것이다.

또한, C언어에서 0이외의 값들을 모두 참이라 간주한다.

그러므로 1이 아닌 다른 값이 저장되도 C언어는 참 값으로 생각을 한다는 것이다.

이와 관련된 간단한 코드를 보자.

5를 참값으로 간주해 논리 연산자 !로 인해 거짓값은 0이 출력되었다.

 

콤마 연산자

이 연산자는 다른 연산자와는 달리 무언가를 연산한다기보다는 코드의 구분을 목적으로 사용된다.

둘 이상의 변수를 동시에 선언하거나, 둘 이상의 문장을 같은 행에 삽입하는 경우 사용된다.

위에서도 무의식적으로 사용한 콤마가 바로 콤마 연산자이다.

아래의 예시를 보자.

까먹고 7, 8행에 주석을 달지않았지만, 모두 콤마 연산자를 사용했다.

 

 

연산자와 우선순위의 결합방향에 대해선 열혈C의 69페이지 표를 참고하자.

'기타 > 글보관' 카테고리의 다른 글

(C) 변수  (0) 2019.08.09
(C) 주석의 활용  (0) 2019.08.08
(C) Hello world! 출력하기 응용편  (0) 2019.03.24
(C) Hello world! 출력하기  (0) 2019.03.14