C 언어 기초

unsigned int i;
for (i = 3; i >= 0; i--)
    printf("%u ", i);

unsigned int는 32비트로 한다. 위의 코드를 실행했을 때의 동작으로 올바른 것은?

  1. A3 2 1 0을 표시하고 끝난다
  2. B3 2 1을 표시하고 끝난다
  3. C3 2 1 0을 표시한 후에도 끝나지 않고, 4294967295부터 값을 줄이면서 계속 표시한다
정답과 해설 보기

정답: C. 3 2 1 0을 표시한 후에도 끝나지 않고, 4294967295부터 값을 줄이면서 계속 표시한다

i는 부호 없는 형이므로 음수가 되는 일이 없고, 조건 i >= 0은 항상 참입니다. i가 0일 때 i--를 하면 2³² − 1 = 4294967295로 돌아가며, 루프는 끝나지 않고 4294967294, 4294967293으로 계속 표시합니다. 0까지 카운트다운하고 싶은 경우에는 int를 사용하거나, for (i = 4; i-- > 0; )처럼 작성 방식을 바꿉니다. gcc에서는 -Wextra를 붙이면 이 비교가 항상 참이라는 경고가 나옵니다.

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

C 언어 기초의 다른 문제

  1. 'char c = 200;'으로 한 c를 printf의 %d로 표시하는 프로그램을 x86-64 Linux용 gcc로 컴파일하여 실행하면 −56, Arm Linux용 gcc에서는 200이 표시되었다. 차이가 생기는 이유로 올바른 것은?
  2. &&와 ||의 오른쪽에 b++를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?
  3. break가 없는 case를 포함하는 위의 switch 문을 실행했을 때의 출력으로 올바른 것은?
  4. 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
  5. 위의 함수 f를 3번 연속으로 호출했을 때, 세 번째 반환값으로 올바른 것은?