[C언어] 산술연산자(+,-,*,/,%) 우선순위와 결합 방향

ET의 공부/C언어|2019. 11. 27. 22:24

안녕하세요.

이번 포스팅은 C언어에서 산술 연산자(+,-,*,/,%) 우선순위와 결합 방향에 대해 포스팅해보겠습니다.

 

C언어는 산술 연산자(arithmeticOperator)를 이용하여 산술 연산을 표현합니다. 산술의 뜻대로 계산에 사용됩니다.

 

덧셈 연산자: +

 

덧셈 연산자(addition operator)는 자신의 좌우에 있는 값을 더합니다. 1+1처럼 말이죠.

그런데 우리는 1+1 = 2 라는 표현을 써왔지만 C언어의 경우 조금 다릅니다. 대입 연산자 = 의 왼쪽에 있는 값은 변수의 이름이고 오른쪽이 그 변수에 저장될 값이 됩니다. 예를 들면

 

#include <stdio.h>
 
int main (void)
{
    int sum = 0;
    sum = 1+1;
    printf("1+1 = %d",sum);
    //출력:  1+1 = 2
    return 0;
}
 

 

이와 같이 1+1은 대입연산자 = 의 왼쪽항 sum에 저장됨을 볼 수 있습니다. 그럼 sum = sum + 1의 값은 무엇일까요? 우리가 아는 방정식으로 풀이를 한다면 0 = 1로 맞지 않습니다. 하지만 코드에서는 sum의 값을 알아내어 1을 더하고 그 값을 sum에 대입하라는 뜻이 됩니다.

 

#include <stdio.h>
 
int main (void)
{
    int sum = 0;
    sum = sum+1;
    printf("sum = %d",sum);
    //출력:  sum = 1
    return 0;
}

 

이렇게 말이죠. 아무튼 +는 덧셈연산자로서 덧셈 연산을 수행하게 됩니다. 

 

 

뺄셈 연산자: -

 

뺄셈 연산자(subtraction operator)는 자신의 좌우에 있는 값을 빼줍니다. 

 

#include <stdio.h>
 
int main (void)
{
    int sum = 0;
    int num1 = 7;
    int num2 = 4;
    sum = num1 - num2;
    printf("sum = %d",sum);
    //출력:  sum = 3
    return 0;
}
 

 

이렇듯 덧셈 뺄셈을 수행하는 +,- 연산자는 두개의 피연산자를 필요하기 때문에 이항 연산자(dyadic operator)라고 부릅니다.

그러면 마이너스 표현은 어떻게 할까요? 단항연산자(unary operator)를 사용하면 됩니다.

 

 

 

부호 연산자: +, -

단순히 마이너스를 표현하고 싶을때는 단항에 -기호를 붙여주면 됩니다.

-1,-2 또는 -(변수명) 처럼 말이죠. 이는 다음과 같습니다.

 

#include <stdio.h>
 
int main (void)
{
    
    int num1 = 7;
    num1 = -num1;
    printf("num1 = %d",num1);
    //출력:  num1 = -7
    return 0;
}
 

 

 

곱셈 연산자: *

 

곱셈 연산자(multiplication operator) *는 자신의 좌우 값을 곱해줍니다.

 

#include <stdio.h>
 
int main (void)
{
    int sum = 0;
    int num1 = 7;
    int num2 = 9;
    sum = num1 * num2;
    printf("sum = %d",sum);
    //출력:  sum = 63
    return 0;
}

 

 

나눗셈 연산자: /

 

나눗셈 연산자는  / 기호 왼쪽에 있는 값이 오른쪽의 있는 값으로 나누어집니다. 예를 들면 9/3 은 3이 되겠죠.

그런데 여기서 주의할 점이 나눗셈 연산자는 정수형과 부동소수점에 대해 다른 결과갑이 나옵니다.

부동소수점형은 부동소수점형 값을 내고

정수형 나눗셈은 정수형 값을 냅니다. 그런데 정수형을 7/3을 한다면 2.3333....이 나오는데 이는 정수형이 아니게 됩니다. 

따라서 정수형 나눗셈의 결과로 나오는 소수부분은 버리게 됩니다. 이를 한번 예제로 살펴보도록 하겠습니다.

 

#include <stdio.h>
 
int main (void)
{
    //나눗셈 연산자
    printf("정수형: 9/3 =%d\n",9/3);
    printf("정수형: 9/4 =%d\n",9/4);
    printf("부동소수점형: 9./3. =%f\n",9./3.);
    printf("부동소수점형: 9./4. =%f\n",9./4.);
    //출력
    //정정수형: 9/3 =3
    //정수형: 9/4 =2
    //부동소수점형: 9./3. =3.000000
    //부동소수점형: 9./4. =2.250000
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

정수형의 9/4는 나머지가 버려진 2가 나오게 되고 부동소수점형은 2.25가 나오게 되었습니다.

그럼 정수형과 부동소수점형을 혼합해서 사용하게 되면 어떻게 될까요?

 

#include <stdio.h>
 
int main (void)
{
    //나눗셈 연산자 예제
 
    printf("부동소수점형,정수형: 9./4 =%f\n",9./4);
    //출력
    //부동소수점형,정수형: 9./4 =2.250000
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

결과는 부동소수점형 나눗셈 연산과 같이 나왔습니다. 컴파일러가 피연산자들을 동일한 데이터로 변환하였기 때문인데요. 하지만 일반적으로 데이터형을 혼합하여 사용하는 것은 피해야 합니다.

 

 

나머지 연산자: %

 

나머지 연산자(modulus operator) % 는 정수형 계산에 사용됩니다. 나눗셈의 나머지를 구하는데 사용되며 부동소수점형에서는 동작하지 않습니다.

#include <stdio.h>
 
int main (void)
{
    //나머지 연산자
    printf("정수형 나머지 연산: 9%%4 =%d\n",9%4);
    //출력
    //정수형 나머지 연산: 9%4 =1
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

정리하자면

 

연산자  
+ 덧셈 연산
- 뺄셈 연산
* 곱셈 연산
/ 나눗셈, 같은 데이터 형끼리( 정수형은 나머지를 버림 )
% 나머지 연산, 정수형 데이터형에서만 사용가능

입니다. 이러한 연산자들은 우선순위가 있습니다.

연산자 ( 아래로 갈수록 우선순위가 낮다 )  결합 방향
( ) 왼쪽 -> 오른쪽
+ -  (단항연산자, 부호) 오른쪽 -> 왼쪽
* / 왼쪽 -> 오른쪽
+ - (이항 연산자, 연산) 왼쪽 -> 오른쪽
= 오른쪽 -> 왼쪽

우리가 흔히 하는 연산의 순서와 같습니다. 우리는 계산을 할때 곱셈, 나눗셈을 먼저 하고 덧셈, 뺄셈을 하듯 말이죠.

그리고 결합방향은 보통 연산은 왼쪽에서 오른쪽으로 하지만 단항연산자와 대입 연산자는 오른쪽에서 왼쪽으로 연산이 됩니다. 

댓글()