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


발생하는 문제 및 실행환경

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

#include <stdio.h>

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

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

    return 0;
}
  • 2016년 01월 29일에 작성됨

조회수 186


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번 출력됩니다.

  • 2016년 01월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close