C의 >>>= 연산은 뭘 하는 건가요?

조회수 1245회

발생하는 문제 및 실행환경

학교에서 과제로 내준 건데 이 코드가 뭘 하는 건지 왜 정상적으로 실행되는 건지 모르겠어요 >>>=이거는 뭐하는 건가요? 왜 출력은 ???이죠?

#include <stdio.h>

int main()
{
    int a[2]={ 10, 1 };

    while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
        printf("?");

    return 0;
}

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] ) 를 차근차근 하나씩 뜯어보면,

    이중자(digraph) :><:를 각 각 ][로 바꿔 while( a[ 0xFULL?'\0':-1] >>=a [!!0X.1P1 ] )

    가 되고, 0xFULLtrue이기 때문에 0xFULL?'\0':-1'\0', '\0'은 간단하게 0으로 쓸 수 있으므로 while( a[0] >>=a [!!0X.1P1 ] )

    그리고 0X.1P1은 16진수 부동소수점이고, 10진수로 표현하면 0.125입니다. 이 또한 0이 아니기 때문에 항상 true이므로 !!0X.1P1은 1입니다. while( a[0] >>=a[1] )

    >>=연산자는 아실 겁니다. 오른쪽의 값만큼 왼쪽 값을 shift하지요. a[1]=1이므로 실제로는 while( a[0] >>= 1 ) 이고, 다르게 쓰면 while(a[0]/=2)와 같습니다.

    첫 번째 while loop에서는 a[0]/2 = 5 -> "?"출력 두 번째 while loop에서는 a[0]/2 = 2 -> "?"출력 세 번째 while loop에서는 a[0]/2 = 1 -> "?"출력 네 번째 while loop에서는 a[0]/2 = 0 -> while문 끝남 이기 때문에 ?이 3번 출력됩니다.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.