소프트웨어/C 언어

[C언어]15. 변수의 계산방법, 연산자에 대하여 알아보자. -3- ( 이항연산자 )

리습 2013. 6. 6. 02:00


 안녕하십니까. 리습입니다.



이번엔 연산자 중 이항연산자에 대하여 알아보도록 하겠습니다. 이항연산자는 연산을 할때 필요한 항이 2개 인 연산자를 뜻합니다. 즉 하나의 피연산자만으론 연산이 불가능 하다는 것이죠. 하나씩 알아보도록 하겠습니다.

  산술 연산자 ( + - * / % )

 

 산술 연산자는 말 그대로 기본적인 수학 연산을 위해 있는 것입니다. +는 더하기 - 는 빼기 * 곱하기, / 나누기 중  몫, % 나누기 중 나머지 값을 의미합니다. 즉 3+2 는 5라는 값을 의미하고 3 - 2 는 1을 의미하며 3 * 2 는 6을 의미하고 3 / 2 는 몫 1을 의미하며 3 % 2 는 나머지 1을 의미합니다. 산술연산자는 매우 직관적이고 우리가 일상적으로 사용하는 수식과 닮았기 때문에 매우 쉬운 편입니다. 또한 가장 많이 쓰이기도 하므로 한번 예시 코드를 들어보도록 하겠습니다.

 

  코드

  #include <stdio.h>

 

 int main ( void ) 

 {

       printf("%d \n ", 11 + 5 );

       printf("%d \n ", 11 - 5);

       printf("%d \n ", 11 * 5 );

       printf("%d \n ", 11 /  5 );

       printf("%d \n ", 11 % 5 );

       return 0;

}

 

 결과

 16

 6

 55

 2

 1

 



단순하게 수학적인 연산을 처리하는 것이지만 여러가지로 응용 할수 있고 많이 쓰이므로 잘 알아두는 것이 좋습니다.

 

 

  대입 연산자 (  =  )

 

 대입 연산자는 말그대로 특정 변수의 공간에 어떤 값을 넣을 때 사용합니다.  우리가 지금까지 굉장히 많이 사용해왔던 = 가 바로 대입 연산자 입니다. 왼쪽에 대입받으려는 변수 혹은 공간의 이름을 놓은 후 오른족에는 특정 넣어주려는 데이터를 써주면 됩니다.

 

< 변수 혹은 데이터 공간 >  =  < 넣으려는 값 > 

 

  예시 코드

  

 int i = 100

 

 

 

 위 코드는 int 로 선언되어있는 i 라는 변수 공간에 100이라는 값을 넣어주는 것입니다.

 

 

  관계 연산자 (  ==   !=   >   <   >= <= )

 

 

 관계 연산자는 두개의 피연산자를 비교하는 연산자들입니다. 기호를 보면 알수 있듯이 어떤게 더크고 작은지 판독하고 같은지 결과를 내주는 것입니다. 관계 연산자는 연산값이 어떤 관계인지만 확인하고 맞으면 TRUE 값을 내보내고 틀릴경우 FLASE 값을 내보냅니다. 이 관계연산자는  조건을 필요로 하는 곳에서 많이 쓰이는데 if 문을 이용한 프로그램을 예시를 보도록 하겠습니다.  

 

 

  코드

  #include <stdio.h>

 

 int main ( void ) 

 {

       int i = 0;

       printf("숫자 하나를 입력해주세요 :  ");

       scanf("%d", &i);

      if ( i > 100 )

     {

            printf("숫자가 100 보다 큽니다.\n");

     }

     else

    {

           printf("숫자가 100 보다 같거나 작습니다. \n ");

    }

   return 0;

}

 

 결과

 

 숫자 하나를 입력해주세요 : 30

 숫자가 100 보다 같거나 작습니다.

------------------다시 실행한후 ---------------------------------

 숫자 하나를 입력해주세요 : 120

 숫자가 100보다 큽니다.


 

실제 실행시켜보면 다음과 같습니다.



 

이렇게 관계 연산자는 조건문들과 같이함께 쓰이는 경우가 많고 잘 조합하면 여러가지 조건문을 만들수 있게 됩니다.

 

 

  구조체 연산자 (  . ->  )

 

 

 C언어에는 구조체라는 변수의 집합모임이 있습니다. 이때  구조체의 내부의 변수에 연결하기 위해서 사용하는 연산자가 . 와 -> 연산자 입니다.  그냥  . 을 찍을 경우 구조체 내부의 변수 이름이 나오게 되고 -> 의 경우 포인터로 연결되어있는 값의 내부로 연결됩니다.



(apple 이라는 구조체를 선언하고 구조체 내부를 찾아들어가는 경우이다. , 연산자를 보여주기 위해 작성된 코드로 실제 구조체를 선언한 것은아님)

 

 후에 구조체에 대하여 자세히 알아볼때 다시 보도록 하겠습니다.

 

 

  논리 연산자 (  || &&  )

 

 

 논리기호중  and 과 or 라는 것이 있습니다.  and의 경우 "두개 다 모두" 라는 의미이고 or 은 "두개중 하나라도" 라는 의미 입니다. 진리표로 보면 다음과 같습니다.

 AND

 0

 1

 OR

 0

 1

 0

FLASE 

FLASE 

 0

 FLASE

TRUE 

 1

 FLASE

 TRUE

 1

TRUE 

TRUE 

 

 

다음과 같이 AND 는 모두, OR 은 둘중에 하나라도 라고 이해하시면 됩니다. 이러한 표현을 가능하도록 하는 것이 논리연산자 || 와 && 입니다. 보통 논리연산자는 관계 연산자와 같이 쓰입니다. 두개의조건을 표현할 때 말이죠. 1보다 크고 10보다 작은 을 표현하려면 다음과 같이 하면 됩니다.

 

 

  예시 코드

  

 if ( i > 1 && i < 10 ) 

 

 

 

만약 1보다 큼과 동시에 10보다 작다면 이라는 의미 입니다. 이렇게 논리연산자는 다른 연산자와 함께 쓰입니다.

 

 

  비트연산자 (  <<   >>  &   |  ~  )

 

 

 

 컴퓨터의 기본 단위는 0, 1 를 표현하는 비트입니다. 이러한 비트 단위의 연산을 가능하도록 하는 것이 비트연산자입니다. 비트 연산자 중 << 과 >> 는 각 데이터에 저장되어있는 비트값을 좌 우로 옮기라는 의미입니다 

 

 비트단위로 00001111 이라고 되어있다면 << 연산자를 사용하면 00011110 이 되는 것입니다. 예시 코드를 보도록하겠습니다.

 

 

  예시 코드

  

 char i = 0x0F 

 i << 2

 

 

 

 

다음 코드는 i 라는 1바이트 짜리 공간에 16진수로 00001111을 넣어준후 그값을 오른쪽으로 2칸 밀어준것입니다. 그러면 결과적으로  i는  00111100 이 될것입니다. 이렇게 << 와 >> 는 비트 단위로 값을 밀어주는 역활을 합니다. 그래서 2진수가 한칸씩 밀리면 2배가 되는 현상을 사용해 2, 4, 8 의 곱하기의 경우 비트연산자로 << 1, 2, 3 으로 나타내면 가능합니다. 물론 속도 또한 곱하기 기호로 * 2, 4, 8 하는 것보다 몇배 빠릅니다. 알아두면 좋은 것으로 굳이 사용할 필요는 없습니다. 

 

또한 비트연산자 & 와 | 는 앞서 봤던 논리연산자의 비트버전이라고 보시면 됩니다. 논리연산자가 데이터 전체 값으로 본다면 비트 연산자는 각 비트단위로 and or 연산을 합니다. 또한 ~ 의 경우 not 의 의미를 가지고 모든 비트를 역전시켜버립니다. (0 을 1 로 1을 0으로 바꾼다는 의미입니다.) 예를 들어 01010 을 ~ 연산자를 사용하면 10101 이 됩니다. (참고로 ~ 는 이항연산자는 아니지만 통일성을 위해 여기서 언급합니다.)

 

비트연산자의 경우 지금당장은 별로 쓸일이 없지만 하드웨어쪽이나 매우 속도가 빠른 연산 프로그램을 만들 경우에는 많이쓰이게 됩니다. (C언어의 장점이기도 합니다.) 만약 하드웨어를 직접 제어하는 C프로그램을 만드실경우 정말 많이 쓰시게 될것입니다. 

 

 

 

  쉼표 연산자 (  ,  )

 

 

 

 몇가지 작업을 한꺼번에 할때 많이 쓰입니다. 하나씩 써주는 것으로 설명보다는 어떤곳에 쓰인다는걸 보는게 더 좋습니다.

 

 

  예시 코드

  

  int a = 1 , b = 2 , c = 3, d = 4;

 

 

 

예시코드를 보면 int 라는 변수공간을 만들겠다고 선언을 한 후 a b c d 를 차례로 써주고 있습니다. 이것을 int a ; int b ; int c ; int d 이런식으로 사용하지 않고 쉼표를 사용해서 편안하게 쓰는 것입니다.

 

 

 

  우선순위 연산자 (  (  )  )

 

 수학문제에서 먼저 풀어야 하는 식이 있다면 괄호를 사용해서 표현해줍니다. 그것과 마찬가지입니다. 연산자에 대해서도 순서대로 처리가 되기 때문에 그것들보다 우선적으로 처리하려면 (  ) 을 써서 먼저하라 라고 표현해주는것입니다. 예시를 보도록 하겠습니다.

 

 

  예시 코드

  

   i = 2 * (3 + 2);

 

 

 

 만약 여기에서 ( ) 를 쓰지 않았더라면  값은 2*3을 진행한후에 2를 더했을 것입니다. 그렇다면 우리의 의도에 맞지 않게 되므로 덧셈을 먼저할 수 있게 (  )로 감싸준것입니다. 

 

 만약 애매하고 꼭 순서에 맞게 연산되야 하는것들이 있다면 ( ) 를 많이 써주는것도 좋은 방법입니다. 

 

이렇게 이항연산자들에 대해서도 알아보았습니다. 정말여러가지가 있고 외어야 할것도 있지만 이렇게 많은 연산자의 존재가 바로 C언어의 장점입니다. 꼭 익히고 장점을 잘 이용하시기 바랍니다.