C 언어 기초

unsigned int reg = 0x04;
if (reg & 0x04 == 0x04)
    printf("ON\n");
else
    printf("OFF\n");

레지스터 값 reg의 비트 2가 1인지를 조사할 생각으로 위의 코드를 작성했다. 실행했을 때의 결과로 올바른 것은?

  1. AON이 표시된다
  2. BOFF가 표시된다
  3. C&와 ==를 이어서 쓸 수는 없으므로 컴파일 오류가 된다
정답과 해설 보기

정답: B. OFF가 표시된다

C 언어에서는 비교 연산자 ==가 비트 단위 논리곱인 &보다 우선순위가 높습니다. 따라서 조건은 reg & (0x04 == 0x04)로 해석되고, 0x04 == 0x04가 1이 되므로 0x04 & 1 = 0으로 거짓이 되어 OFF가 표시됩니다. 의도대로 하려면 (reg & 0x04) == 0x04처럼 괄호를 붙입니다. 문법상으로는 올바르므로 오류는 되지 않지만, gcc의 -Wall에서는 경고가 나옵니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. uint8_t는 8비트의 부호 없는 정수형이다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  2. uint8_t는 8비트의 부호 없는 정수형이다. x를 10번 증가시키는 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. unsigned char는 8비트, int는 32비트로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  4. uint8_t는 8비트의 부호 없는 정수형, int는 32비트로 한다. 위의 코드를 실행했을 때의 결과로 올바른 것은?
  5. int와 unsigned int는 32비트로 한다. 위의 코드를 실행했을 때의 결과로 올바른 것은?