c·c++/c 프로그래밍

c언어 연산자의 이해

바로이순간 2013. 10. 7. 17:17

#include<stdio.h> 

int main() { 

    unsigned int m=5, n=2; 


    // 이 줄에서 %% 로 해주어야 할 것을 %로 한 것이 오류입니다.

    // 덧셈의 결과 뺄샘, 나눗셈의 몫, 나눗셈의 나머지 입니다. 

    printf("m+n=%d, m-n=%d, m/n=%d, m%%n=%d\n" , 

        m+n, m-n, m/n, m%n); 


    // 논리적 관계식의 결과입니다. 참이면 1, 거짓이면 0이 출력이 됩니다.

    // m은 n보다 크니까 1이 출력이 됩니다. 작지 않으니까 0, 


    // 같지 않으니까 0이 출력이 되고

    // m은 n보다 작지 않으니까 0이출력이 됩니다.

    printf("m>n=%d, m<n=%d, m==n=%d, m>=n=%d, m<=n=%d\n",

        m>n, m<n, m==n, m>=n, m<=n);


    // 수가 0이 아니라면 참으로 해석이 됩니다.

    // m은 참이고 1도 참이므로 &&를 해주면 참(1)이 됩니다.


    // m은 참이고 1도 참이므로 ||를 해주면 참(1)이 됩니다.

    // m은 참이고 !m은 거짓이므로 0이 됩니다.

    // n도 참이고(0이 아니고) !n은 거짓이므로 0이 됩니다. 

    printf("m&&1=%d, n||1=%d, !m=%d, !n=%d\n", 

        m&&1, n||1, !m, !n); 


    // 3항 연산자입니다. 

    // 앞의 관계식이 참이면 m을 거짓이면 n의 값이 결과값입니다.

    // m이 n보다 크므로 결과값은 m입니다.

    printf("m>n?m:n=%d\n", m>n?m:n); 


    // m&n은 비트연산으로 &(and)입니다.

    // 2진수로 m은 101이고 n은 10 입니다.

    // &를 하면 000이 되기 때문에 결과는 0입니다.


    // m|n은 비트연산으로 |(or)입니다.

    // |를 하면 111이 되기 때문에 결과는 7입니다.


    // m^n은 비트연산으로 ^(xor exclusive or)입니다.

    // 둘 중에 한비트만 1이면 1이 됩니다.

    // ^를 하면 111이 되기 때문에 결과는 7입니다.


    // ~m은 m의 비트를 역전시킨 것입니다.

    // 이는 m의 1의 보수입니다. 


    // 이 수에 1을 더하면 (m의 2의 보수) -5가 됩니다.

    // 따라서 ~m은 -6이 나옵니다.

    printf("m&n=%d, m|n=%d, m^n=%d, ~m=%d\n", 

        m&n, m|n, m^n, ~m); 


    // m<<n 은 m을 왼쪽으로 2비트 쉬프트 시킨 결과입니다.

    // 값이 4배가 됩니다. 따라서 20이 나옵니다.


    // m>>n은 m을 오른쪽으로 2비트 쉬프트 시킨 결과입니다.

    // 101이 2비트 오른쪽으로 쉬프트 되면 1만 남습니다.

    // 따라서 결과는 1이 나옵니다.

    printf("m<<n=%d, m>>n=%d\n", 

        m<<n, m>>n); 


    // (m, n)의 결과는 괄호의 맨 뒤에 나오는 값입니다.

    // 따라서 (m, n)의 값은 2가 됩니다.


    // m=n 의 결과는 n의 값이 m에 대입되고, 대입된 값이 결과입니다.

    // 따라서 결과는 2이고 m의 값, n의 값 모두 2입니다.

    printf("(m,n)=%d, m=n=%d\n" , 

        (m,n), m=n); 


    // 먼저 m과 n이 더해지면 4가 됩니다. 

    // 이는 논리적으로 참으로 해석됩니다.


    // &&는 ||보다 우선순위가 높습니다.

    // 그래서 &&를 먼저 구합니다.


    // m+++n<<2은 m++ +n<<2 로 해석됩니다.

    // m++는 2이고 (m은 나중에 3으로 바뀝니다)

    // n<<2는 8입니다. 2 + 8은 10이 되어서 참으로 해석됩니다.


    // 1은 참입니다. &&를 해주어도 참입니다.


    // 하지만 이렇게 모두 구하지 않고 앞부분에서 참이 나오고 || 가 

    // 나오므로 뒤부분은 구해보지 않고 참으로 해석합니다.

    // 따라서 결과는 1입니다.


    // 따라서 다음 문장에서 m을 출력해 보면 그대로 2가 나오는 것을 

    // 알수 있습니다.

    printf("m+n||m+++n<<2&&1=%d\n", 

        m+n||m+++n<<2&&1); 

    printf("m=%d\n", m);


    return 0;