본문 바로가기
Basic/C/C++

[C언어] 제 5 강 : 연산자

by boxbop 2012. 1. 7.
반응형

 제5강에서는 C언어에서 자주 사용하는 '연산자'에 대해서 알아보도록
하겠습니다^-^;; 내용이 생각보다 많아서 간단하게 설명하도록 하겠습니다!

 1. 대입 연산자 & 산술 연산자

 일단 2개의 피연산자를 필요로 하는 연산자를 '이항 연산자'라고 합니다.
C언어에서 사용하는 연산자는 대부분 이항 연산자입니다. 물론 단항 연산자도 존재하는대 좀 이따가 설명하도록 하구요~

 = : 오른쪽에 있는 값을 왼쪽에 있는 변수에 대입합니다.
      ex) int value =  10;
 + : 2개의 피연자의 값을 더합니다.
      ex) int value = 10 + 20;
 - : 왼쪽의 값에서 오른쪽에 있는 값을 빼줍니다.
      ex) int value = 20 - 10;
 * : 2개의 피연자의 값을 곱합니다.
      ex) int value = 10 * 20;
 / : 왼쪽의 값을 오른쪽의 값으로 나눕니다.
      ex) int value = 10/2;
 % : 왼쪽의 값을 오른쪽의 값으로 나눈 나머지를 반환합니다.
      ex) int value = 10%2;

 이러한 이항연산자에서 중요한 점은 값들의 자료형이 동일해야만 연산이 가능합니다. 그렇다면 연산자를 사용할때마다 다른 자료형은 형 변환을 통해서 자료형을 일치시켜줘야될까요? 아닙니다. 똑똑한 C언어는 연산을 위해서 각기 다른 피연산자들의 자료형을 일치시켜줍니다. 여기서 규칙은 값의 표현 범위가 넓은 쪽으로 변환된다는 점이죠.

 2. 복합 대입 연산자

 1번에서 살펴본 이항연산자들은 실제로 소스코딩 과정에서 빈번하게 사용됩니다. 그래서 C언어는 좀 더 간결하게 표현하기위해 '복합 대입 연산자'를 만들어냈습니다.

 a = a + b     ->     a += b
 a = a - b     ->     a -= b
 a = a * b     ->     a *= b
 a = a / b     ->     a /= b
 a = a % b     ->     a %= b

 왼쪽에 있는 수식과 오른쪽에 있는 수식은 완전하게 동일합니다. +=, -= 이런 것들이 복합 대입 연산자에 속합니다. 그러나 개인적으로 소스코드의 가독성을 위해 복합 대입 연산자 보다는 풀어서 사용하는 편입니다. 좋은 프로그래머가 되기위해서는 여러가지 표현 방법을 익혀두는 것이 좋습니다.

 3. 단항 연산자

 + : 양수를 의미합니다.
 - : 음수를 의미합니다.
 ++ : 피연산자에 저장된 값을 1 증가 시켜줍니다.
 -- : 피연산자에 저장된 값을 1 감소 시켜줍니다.

 여기서 ++ 와 -- 를 보통 증가/감소 연산자로 부르는데요 보기에는 별거 아닌 것 같아보여도 상당히 중요한 연산자입니다. 증가/감소 연산자는 '전위 연산자'와 '후위 연산자'가 있습니다. 

 int value = 10;
 value++;
 ++value;

 위 예제를 보시면 연산자가 앞 또는 뒤에 붙어있느냐에 따라서 전위와 후위로 나눠지게 됩니다. 이 부분은 연산자의 우선순위에서 다루지만 저는 우선순위는 따로 설명할 계획이 없어서 지금 간략하게 설명해드리도록 하겠습니다^-^!!;;;
일단 결과값은 value++ 는 10에서 1이 증가했으므로 11이 됩니다. ++value는 증가된 11에서 1이 증가했으므로 12가 됩니다. 여기서 무엇이 다르냐구요? 후위 연산자는 우선순위가 제일 마지막이라는 것 입니다. 위와 같은 예제에서는 차이점은 없습니다. 1이 증가된다는 사실 이외에 눈으로 확인할 수 있는 방법이 없죠... 

 int value = 0;
 printf("%d", ++value);

여기서는 전위 연산자가 사용됬습니다. 출력되는 값은 1이 되겠죠?

 int value = 0;
 printf("%d", value++);
 printf("%d", value);
 
여기서는 후위 연산자가 사용됬습니다. 출력 값은 2개가 존재하겠죠? 처음으로 출력되는 값은 0입니다. 후위 연산자가 사용됬으므로 printf함수를 실행한 다음에 value의 값을 1증가 시킵니다. 두번째 printf문에서는 그냥 value의 값을 출력시켜 봤습니다. 출력값은 1입니다. 전위 연산자와 후위 연산자의 차이점을 아셨나요?

 4. 관계 연산자

 '관계 연산자'는 말 그대로 크기나 동등관계를 비교하는 연산자 입니다. 관계 연산자도 이항연사자에 속하죠~ 바로 예를 들어서 설명하겠습니다.
 
 n1 < n2 : n1의 값이 n2의 값보다 작다
 n1 > n2 : n1의 값이 n2의 값보다 크다
 n1 == n2 : n1의 값과 n2의 값이 같다
 n1 != n2 : n1의 값과 n2의 값이 다르다
 
 여기서 '!' 기호는 부정을 뜻합니다. 그리고 < , > 연산자에서 <=, >= 이렇게 사용할 수 있는데요, 이 뜻은 같거나 작다 또는 같거나 크다를 의미 합니다.
관계 연산자의 결과 값은 bool형을 반환하는데요 참이면 1, 거짓이면 0을 반환합니다. 예를 들어 10 == 20 이라면 같지 않으므로 거짓어 되어 0 이라는 값을 반환하구요 10 < 20 이면 10이 20보다 작으므로 참이 되어 1 이라는 값을 반환합니다.

 5. 논리 연산자

 논리 연산자도 관계 연산자와 마찬가지로 참과 거짓을 구별해줍니다. 그러나 관계 연산자와는 조금 다르죠~

 A && B : A와 B가 모두 참이면 참값 1을 반환합니다.
 A  || B : A와 B 둘중 하나라도 참이면 참값 1을 반환합니다.
    !A     : A가 참이면 그 반대 값인 거짓, A가 거짓이면 그 반대 값인
             참을 반환 합니다.

 좀 더 구체적으로 예를 들어보겠습니다.

 int number1 = 1, number2 = 2, number3 = 3;
 int result1, result2, result3;

 result1 = (number1 == 1 && number2 == 2); // 결과값 1
 result2 = (number1 == 1 || number 2 == 3); // 결과값 1
 result3 = !number2; //결과값 0

 result1과 result2는 이해가 가셨나요~? 그렇다면 result3은 어떻게 된걸까요? number2에 저장되어 있는 값은 2입니다. 이 값을 참으로 판단하여 그의 반대인 거짓값 0을 반환했습니다. 여기서 중요한 것은 0이외에 모든 값은 참으로 인식한다는 점 입니다. 따라서 2도 참값으로 판단하기때문이죠~~~

 6. 콤마 연산자

 int number1 = 1;
 int number2 = 2;

 이러한 소스코드를 다음과 같이 나타낼 수 있습니다. 물론 콤마 연산자를 사용해서요^^

 int number1 = 1, number2 = 2;

위의 예제와 아래의 예제는 동일합니다. 콤마 연산자는 번거로움을 덜어주죠^^

7. 자료형 변환 연산자

  int형을 double형으로 또는 double형을 int형으로 변환시켜주는 것처럼 각각의 자료형간의 형 변환을 가능하게 해주는 연산자를 자료형 변환 연산자고 합니다.

 printf("%f", (double)3 );
 printf("%d", (int)3.14 ) ;


첫 번째 문장은 3.14는 분명 정수형인대도 불구하고 서식문자 %f를 사용해서 나타냈습니다. (double)3 은 int형 상수 3을 double형 상수로 변환하라는 의미입니다. 반대로 (int)3.14는 double형 상수 3.14를 int형 상수로 변환하라는 의미이구요~ 결과값은 3.000000 과 3 으로 출력 됩니다.

 7. sizeof 연산자

 'sizeof' 연산자는 피연산자의 크기를 '바이트'단위로 계산해서 반환하는 연산자입니다.

int number = 1234;
printf("%d", sizeof(number) );

 위 예제에서 number은 몇 바이트가 될까요? 당연히 number은 int형이기 때문에 4바이트가 출력됩니다. double형이면 8바이트가 출력이 되겠죠? 여럽지 않습니다~ 다만 나중에 배우실 배열에서는 조금 생각하여 계산해봐야되는 부분이 있긴하지만 그건 나중에 다시 짚고 넘어가도록 하겠습니다.

이상으로 연산자에 대한 강의를 마치도록 하겠습니다^~^ㅋㅋㅋㅋ
반응형