C언어 변수 & 연산자 연산자

    2018-03-23 15:00:51 작성

    대입연산자와 산술 연산자

    대입 = 대입연산자 오른쪽에 있는 값을 왼쪽에 대입한다.
    ex) num = 10;
    더하기 + 왼쪽의 값에 오른쪽의 값을 더한다.
    ex) num + 30;
    빼기 - 왼쪽의 값에 오른쪽의 값을 뺀다.
    ex) num - 20;
    곱하기 * 왼쪽의 값과 오른쪽의 값을 곱한다.
    ex) num * 5;
    나누기 / 왼쪽의 값을 오른쪽의 값으로 나눈다.
    ex) num / 7;
    나머지 % 왼쪽의 값을 오른쪽의 값으로 나눴을때 얻게되는 나머지를 반환한다.
    ex) num % 3;

    위와 같이 연산에 필요한 피연산자가 2개인 연산자를 가리켜 이항연산자 라고 합니다.

    #include <stdio.h>
    
    int main(void) {
        int a = 11, b = 4;
        printf("%d + %d = %d \n", a, b, a + b);
        printf("%d - %d = %d \n", a, b, a - b);
        printf("%d × %d = %d \n", a, b, a * b);
        printf("%d ÷ %d = %d \n", a, b, a / b);
        printf("%d ÷ %d 의 나머지 = %d \n", a, b, a % b);
        return 0;
    }


    9항에서 보면 11÷4의 값이 2.75가 아닌 2로 값이 출력되는 것을 볼 수 있습니다.
    C언어에서는 정수 와 정수를 나누기 하게 되면 값이 정수가 되며 이때 소숫점 이하의 값은 버려지게 됩니다.
    10행에서 보이는 % 연산자는 나눗셈의 나머지 값을 구하는 연산자 이며, %연산자는 실수형 자료형 연산에는 사용할 수 없고 정수형 자료형 연산에서만 사용할 수 있습니다.


    복합 대입 연산자

    복합 대입 연산자란 2항 연산결과를 자신에게 대입하는 연산자 입니다.
    다음과 같은 연산자가 있습니다.

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

    #include <stdio.h>
    
    int main(void) {
        int a = 2;
        int b = 4;
        int c = 8;
    
        a += 3; // a = a + 3 과 같음
        b *= 4; // b = b * 4 과 같음
        c %= 3; // c = c % 3 과 같음
    
        printf("a = %d, b = %d, c = %d\n", a, b, c);
        return 0;
    }


    복합 대입 연산자의 의미는 위의 코드에서 보듯이 a += 3; 일경우 a = a + 3; 과 같은 의미인 것을 이해할 수 있을 것입니다.


    부호 연산자

    부호 연산자에는 +, - 가 있습니다.
    +와 -는 이항연산자에서는 덧셈과 뺄셈을 의미하지만, 피연산자가 한개인 단항 연산자로는 부호를 나타냅니다.

    #include <stdio.h>
    
    int main(void) {
        int a = +4; // 부호 연산자 +
        int b = -7; // 부호 연산자 -
    
        a = -a;
        printf("a의 값 : %d\n", a);
    
        b = -b;
        printf("b의 값 : %d\n", b);
    
        a += b; // 복합 대입연산 a = a + b; 와 같음
        printf("복합대입연산 a += b 의 값 : %d\n", a);
        return 0;
    }


    a = -a;b = -b;은 부호 연산자인 -연산을 하여 각 변수값의 부호가 바뀐것을 알 수 있습니다.
    13행은 += 임으로 부호 연산이 아닌 복합 대입 연산자를 사용한 것입니다.


    증감연산자

    ++num 변수 num에 값을 1 증가 후, 속한 문장의 나머지를 진행 (선 증가, 후 연산)
    num++ 속한 문장을 먼저 진행한 후, 변수 num에 값을 1증가 (선 연산, 후 증가)
    --num 변수 num에 값을 1 감소 후, 속한 문장의 나머지를 진행 (선 감소, 후 연산)
    num-- 속한 문장을 먼저 진행한 후, 변수 num에 값을 1감소 (선 연산, 후 감소)

    위의 표에서 보듯이 ++, -- 연산자는 이름 그대로 값을 1 증가 하거나 감소를 합니다.
    그런데 증감연산자의 삽입된 위치에 따라 그 의미가 달라지는데
    변수의 왼편에 붙는경우 (++num) 전위연산 이라 하고
    변수의 오른편에 붙는경우 (num++) 후위연산 이라 하며
    전위 연산의 경우 문장을 진행하기 전에 먼저 증감연산을 한 후 진행이 되고
    후의 연산의 경우 문장을 다 진행한 후에 증감 연산을 합니다.

    #include <stdio.h>
    
    int main(void) {
        int a = 5;
        int b = 7;
    
        printf("a = %d\n", a);
        printf("a++ = %d\n", a++);// 후위연산
        printf("a = %d\n\n", a);
    
        printf("b = %d\n", b);
        printf("--b = %d\n", --b); // 전위연산
        printf("b = %d\n\n", b);
    
        return 0;
    }


    관계 연산자

    관계연산자는 대소 와 동등의 관계를 따지는 연산자입니다.

    < ex) n1 < n2
    n1이 n2보다 작은가?
    > ex) n1 > n2
    n1이 n2보다 큰가?
    == ex) n1 == n2
    n1이 n2와 같은가?
    != ex) n1 != n2
    n1이 n2와 다른가?
    <= ex) n1 <= n2
    n1이 n2보다 작거나 같은가?​
    >= ex) n1 >= n2
    n1이 n2보다 크거나 같은가?​

    관계연산자는 조건을 만족하면 1, 만족하지 않으면 0을 반환합니다.
    C언어에서 0은 false(거짓)을 의미하고 0을 제외한 모든 수는 true(참)을 의미합니다.

    #include <stdio.h>
    
    int main(void) {
        int a = 10;
        int b = 12;
        int result1, result2, result3;
    
        result1 = a == b;
        result2 = a <= b;
        result3 = a > b;
    
        printf("result1 : %d\n", result1);
        printf("result2 : %d\n", result2);
        printf("result3 : %d\n", result3);
        return 0;
    }


    조건을 만족하지 않으면 거짓(0)을 반환하고,
    조건을 만족하면 참(1)을 반환합니다.


    논리연산자

    && ex) A && B
    A와 B가 모두 참이면 참(1)을 반환 (논리 AND)
    || ex) A || B
    A와 B중 하나라도 참이면 참(1)을 반환 (논리 OR)​
    ! ex) !A
    A가 참일경우 거짓(0)을 반환, A가 거짓일경우 참(1)을 반환 (논리 NOT)​

    #include <stdio.h>
    
    int main(void) {
        int a = 10;
        int b = 12;
        int result1, result2, result3;
    
        result1 = (a == 10) && (b == 12); // 둘다 참임으로 1을 반환
        result2 = (a < 12) || (b > 12); // (a < 12)보다 작음으로 b > 12
        result3 = !a;
    
        printf("result1 : %d\n", result1);
        printf("result2 : %d\n", result2);
        printf("result3 : %d\n", result3);
    	return 0;
    }


    result1은 둘다 모두 참이기 때문에 1
    result2는 (a < 12) 참이기 때문에 1이며, (b > 12)는 연산하지 않습니다.
    result3은 0이 아닌 모든 수(음수도 포함)는 참이기 때문에 0


    조건 연산자(3항 연산자)

    조건 연산자는 3항 연산자이고 다음과 같은 형태를 갖습니다.

    조건식 ? 참일때 실행할 코드 : 거짓일때 실행할 코드;

    조건 연산자는 if else 문과 유사하고 단지 기호를 써서 간략히 표현할 수 있다는 장점이 있습니다.
    조건식에 따라 분기하여 실행할 코드를 간략히 표현할 수 있습니다.
    중첩해서 사용하면 가시성이 떨어질수 있습니다.


    sizeof

    sizeof 연산자는 기본자료형에 설명하였듯이 자료형 또는 변수의 크기를 구하는 연산자 입니다.


    기타 연산자들

    포인터에서 다루게 될 *(간접지정 연산자), &(주소 연산자)
    자료형 변환에 사용되는 () 명시적 형변환연산자 등이 있습니다.