C의 >>>= 연산은 뭘 하는 건가요?
조회수 2170회
발생하는 문제 및 실행환경
학교에서 과제로 내준 건데
이 코드가 뭘 하는 건지 왜 정상적으로 실행되는 건지 모르겠어요
>>>=
이거는 뭐하는 건가요?
왜 출력은 ???
이죠?
#include <stdio.h>
int main()
{
int a[2]={ 10, 1 };
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
printf("?");
return 0;
}
1 답변
-
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
를 차근차근 하나씩 뜯어보면,이중자(digraph)
:>
와<:
를 각 각]
와[
로 바꿔while( a[ 0xFULL?'\0':-1] >>=a [!!0X.1P1 ] )
가 되고,
0xFULL
은true
이기 때문에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번 출력됩니다.
댓글 입력