C 언어 기초

#define SQUARE(x) x * x
int a = 3;
printf("%d\n", SQUARE(a + 1));

#define으로 정의한 매크로 SQUARE를 사용하는 위의 코드를 실행했을 때의 출력으로 올바른 것은?

  1. A7
  2. B10
  3. C16
정답과 해설 보기

정답: A. 7

매크로는 전처리기가 문자의 나열을 그대로 치환할 뿐입니다. SQUARE(a + 1)은 a + 1 * a + 1로 전개되고, 곱셈이 먼저 계산되므로 3 + 3 + 1 = 7이 됩니다. 의도대로 (a + 1)의 제곱인 16으로 만들려면 #define SQUARE(x) ((x) * (x))처럼 인수와 전체를 괄호로 감쌉니다. 그래도 SQUARE(i++)처럼 부작용이 있는 인수에서는 i++가 두 번 평가되어 미정의 동작이 되므로, 인라인 함수를 사용하는 방법도 있습니다.

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

C 언어 기초의 다른 문제

  1. 헤더 파일 sensor.h를 위와 같이 작성했다. #ifndef, #define, #endif의 세 줄의 목적으로 올바른 것은?
  2. 위의 코드를 main 함수 안에 써서 실행했을 때의 출력으로 올바른 것은?
  3. 마이컴의 출력 레지스터를 위와 같이 선언하여 사용하고 있다. 이 선언에 대한 설명으로 올바른 것은?
  4. C 언어 규격에서 말하는 미정의 동작의 설명으로 올바른 것은?
  5. int와 unsigned int는 32비트로 한다. 다음 중 C 언어 규격에서 미정의 동작이 되는 것은?