BLOG ARTICLE 연산자 | 1 ARTICLE FOUND

  1. 2007.06.13 5. 연산자

5. 연산자

C에서 연산자는 변수나 상수에 특정한 연산을 하는 C에서 예약된 기호들이며, 일반적으로 수학에서 많이 사용하는 기호와 연산이 유사합니다.

1) =

"="는 변수에 값을 대입할 때 사용하는 연산자 입니다. 일반적으로 사용하는 것과 반대 방향으로 우측에 있는 값을 좌측 변수에 대입 합니다. 상수 뿐만 아니라 아래와 같이 변수, 함수의 반환값, 포인터 등에도 사용할 수 있습니다.

int num1 = 3;
int num2 = GetNum(); /* GetNum은 함수로 후에 설명하겠습니다. */
int num3 = count + 1;
char* p = &n; /* *는 포인터를 나타내는 연산자로 후에 설명하겠습니다. */


2) +, -, *, /, %

실생활에서도 많이 사용하는 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%) 계산에 관한 연산자 들입니다.

연산자에는 우선순위가 있습니다. 일반적인 연산 순서는 좌에서 우로 갑니다. 하지만 () 연산이 최상위에 있고, *, /, % 연산이 +, - 보다 위에 있습니다.

그러므로 아래와 같은 코드가 있다면.

int num1 = 4+4/2;
int num2 = (4+4)/2;

num1에는 6, num2에는 4가 들어 갑니다.

이 연산자들은 또한 "="의 앞에 결합되어 사용할 수 있습니다. 의미는 아래와 같습니다.
int a = 1;

a += 3;        /* a = a + 3;  과 동일 */
a -= 3;        /* a = a - 3;  과 동일 */
a *= 3;        /* a = a * 3;  과 동일 */
a /= 3;        /* a = a / 3;  과 동일 */
a %= 3;        /* a = a % 3;  과 동일 */


3) ==, !=, <, <=, >, >=

위의 연산자들은 두 값의 사이에서 비교하는 연산자이며, 비교값이 참일 경우에는 1, 거짓일 경우에는 0이 됩니다.

  • "a == b" 는 a와 b가 같은지 비교합니다.
  • "a != b" 는 a와 b가 틀린지 비교합니다.
  • "a < b" 는 a가 b보다 작은지 비교합니다.
  • "a <= b" 는 a가 b보다 작거나 같은지 비교합니다.
  • "a > b" 는 a가 b보다 큰지 비교합니다.
  • "a >= b" 는 a가 b보다 크거나 같은지 비교합니다.

nt n1 = (3 == 4);
int n2 = (3 != 3);
int n3 = (3 > 1);
int n4 = (3 > 10);
int n5 = (3 <= 4);

여기서도 = 연산자가 비교 연산자(==, !- 등) 보다 연산순위가 낮기 때문에 괄호를 사용하지 않더라도 비교 연산이 먼저지만 보기 쉽게 하기위해 괄호를 하였습니다.

위에서 값들은 각각 n1는 0, n2는 0, n3는 1, n4는 0, n5는 1의 값을 같습니다.


4) ++, --

증감 연산자는 변수의 값을 1씩 더하거나 빼기를 합니다. 즉 a++은 a = a + 1; 과 같은 의미이며, b--는 b = b - 1; 와 같은 의미입니다. ++, -- 증감 연산자에서 중요한 점은 변수의 앞과 뒤에 위치할 수 있으면, 이것은 연산 순서의 변경을 가지고 옵니다.

++(or --)이 변수 앞에 오면 그 라인의 명령이 실행되기 전에 먼저 ++(or --)가 먼저 실행되고,  ++(or --)이 변수 뒤에 오면 그 라인의 명령이 실행된 후에 ++(or --)가 실행됩니다.

#include <stdio.h>

int main(int argc, char* argv[])
{
    int a = 2;
    int b1 = 4;
    int b2 = 4;

    int c1 = a + b1++;
    int c2 = a + ++b2;
   
    printf("%d, %d, %d, %d", c1, c2, b1, b2);

    return 0;
}

위의 소스를 컴파일 후 실행 하면 "6, 7, 5, 5"가 출력됩니다.

int c1 = a + b1++; 은
int c1 = a + b1;
b1 = b1 + 1;
과 동일하며,

int c2 = a + ++b2; 은
b2 = b2 + 1
int c2 = a + b2; 
와 동일합니다.

5) &&, ||, !

"A && B"는 AND 연산을 하며 A와 B 두개의 값이 모두 0이 아닐 경우, 1을 반환 하고 그 외에는 0을 반환합니다.

"A || B"는 OR 연산을 하며 A와 B 두개의 하나 이상이 0이 아닐 경우, 1을 반환 하고 그 외에는 0을 반환합니다.

"!A"는 A가 0이 아닐 경우에는 0, 0일 경우에는 1을 반환합니다. !A는 (A == 0)과 의미가 같습니다.

아래의 소스를 보면 위의 내용을 확인할 수 있습니다.
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("%d, ", 0 > 1 && 2 > 1);
    printf("%d, ", 0 > 1 || 2 > 1);
    printf("%d\n", !(0 > 1 && 2 > 1));

    return 0;
}

위의 소스를 컴파일 후, 실행하면 0, 1, 1로 출력 됩니다.

printf("%d, ", 0 > 1 && 2 > 1);
&&, ||은 연산자 우선 순위가 낮기 때문에 <, > 보다 늦게 실행됩니다. (0 > 1) && (2 > 1)과 같은 의미입니다. 우선 0 > 1은 거짓(0)이고 2 > 1은 참(1)이므로 위는 "0 && 1"과 의미가 같습니다. && 연산자는 양쪽 모두 0이 아닐때만, 1을 반환하므로 0이 됩니다.

printf("%d, ", 0 > 1 || 2 > 1);
위는 0 > 1은 거짓(0)이고 2 > 1은 참(1)이므로 위는 "0 || 1"과 의미가 같습니다. || 연산자는 하나 이상만 0이 아니면 1을 반환하므로 1이 됩니다.

printf("%d\n", !(0 > 1 && 2 > 1));
(0 > 1 && 2 > 1)는 위 첫번째와 같은 값이며 0입니다.  "!0" (0 == 0)이 되기 때문에 1을 반환합니다.
 

6) &, |, ^, ~, >>, <<

다음은 이전 변수 에서 잠시 살펴 본, 비트에 관한 연산자 들입니다. 이전에 말씀 드린 것과 같이 bit는 0과 1 두가지 경우를 나타낼 수 있는 컴퓨터에서 사용하는 최소 단위입니다.

1. and 연산자(&)
&는 비트 단위로 and 연산을 합니다. &는 양쪽이 다 같이 1일 경우에만 참(1)입니다. 1바이트 에서 &연산은 아래와 같습니다.

#include <stdio.h>

int main(int argc, char* argv[])
{
    unsigned char a = 153;
    unsigned char b = 83;
    unsigned char c;
   
    c = a & b;

    printf("%d", c);

    return 0;
}

1바이트형의 양수만 쓰는 unsigned char형으로 a, b, c를 위와 같이 선언 합니다. 참고로 153은 2진수로 10011001이고 83은 01010011이며 c = a & b 연산은 아래의 그림과 같이 처리 됩니다. (2진수 -> 10진수 변환은 이전 장에 언급되었습니다.)
사용자 삽입 이미지
a, b의 같은 번째의 bit를 비교해서 두개 모두 1일 경우에만, c의 같은 위치가 1이되며 나머지는 0이 됩니다. 위의 소스를 컴파일 하면 17이란 10진수가 나오는데 이는 2진수로 00010001로 위의 c와 같습니다.

2. or 연산자(|)
or 연산자 |는 두 bit를 비교하여 둘 중 어느 한쪽에 1이 있으면 1이 됩니다. 위의 소스 중에서 c = a & b; 부분을 c = a | b;로 변경하시고 컴파일 후 실행하면 확인할 수 있습니다.
사용자 삽입 이미지
실행 후 확인해 보면 10진수로 219가 출력되며, 이는 2진수 11011011로 위의 c와 동일합니다.

3. xor 연산자(^)
xor은 두 비트를 비교하여 서로 다른 값일 경우에만 1이 됩니다. or과 마찬가지로 위의 소스 에서 c = a & b; 부분을 c = a ^ b;로 변경하시고 컴파일 후 실행하면 확인할 수 있습니다.
사용자 삽입 이미지
실행 후 확인해 보면 10진수로 202가 출력되며, 이는 2진수 11001010으로 위의 c와 동일합니다.

4. not 연산자(~)
not은 위의 경우와는 달리 2개의 값에 대한 연산이 아니라, 1개의 값에 대한 연산을 하며, 1은 0으로 0은 1로 비트값을 반전시킵니다. 마찬가지로 위의 소스에서 c = a & b; 부분을 b = ~a;로 변경하시고 확인할 수 있습니다.
사용자 삽입 이미지
실행 후 확인해 보면 10진수로 202가 출력되며, 이는 2진수 01100110으로 위의 b와 동일합니다.

5. 우 쉬프트 연산자(>>)
우 쉬프트 연산은 숫자 만큼 bit를 우측으로 밀어 내고, 밀려 난 비트는 사라집니다. 좌측에 남은 비트는 0으로 채워집니다. 위의 소스에서 c = a & b; 부분을  c = a >> 3;로 변경하시고 확인할 수 있습니다.
사용자 삽입 이미지
위의 이미지를 보면 a를 오른쪽으로 3칸 밀고, 밀려난 좌측의 흑색 부분은 사라집니다.  그 후 비워진 앞부분(연두색)은 0으로 채워집니다.

실행 후 확인해 보면 10진수로 19가 출력되며, 이는 2진수 0001001로 위와 동일합니다.

5. 좌 쉬프트 연산자(>>)
좌 쉬프트 연산은 위의 우 쉬프트 연산과 방식이 동일하며 방향만 다릅니다. 위의 소스에서 c = a & b; 부분을  c = a << 3;로 변경하시고 확인할 수 있습니다.
사용자 삽입 이미지
위의 이미지를 보면 a를 왼쪽으로 3칸 밀고, 밀려난 우측의 흑색 부분은 사라집니다.  그 후 비워진 뒷부분(연두색)은 0으로 채워집니다.

실행 후 확인해 보면 10진수로 200이 출력되며, 이는 2진수 11001000로 위와 동일합니다.

7)  기타

그 외 이 전에 보았던 sizeof, 조건(a ? b:c), ',', '.', '->' 등이 있습니다.

이전장에서 보았던 sizeof는 변수 타입의 크기를 반환합니다.

a ? (b:c)는 a가 참(1)일 경우에는 b, 거짓(0)일 경우에는 c를 반환합니다. 이는 제어문에서 다시 언급하겠습니다. 그외의 것도 각각 함수, 구조체 언급 시에 설명하겠습니다.

'프로그래밍 강좌 > C 언어 기초' 카테고리의 다른 글

7. C 함수 (function)  (4) 2007.06.15
6. 제어문  (0) 2007.06.14
5. 연산자  (0) 2007.06.13
4. 변수  (2) 2007.06.12
3. C 기초문법  (0) 2007.06.05
2. 소스코드, 컴파일, 링크  (6) 2007.06.04