다음 C언어 코드에서 알맞는 출력값을 작성하시오.
#include <stdio.h>
int main(int argc, char *argv[]) {
int a[4] = {0, 2, 4, 8};
int b[3] = {};
int i = 1;
int sum = 0;
int *p1;
for (i; i < 4; i++) {
p1 = a + i;
b[i-1] = *p1 - a[i-1];
sum = sum + b[i-1] + a[i];
}
printf("%d", sum);
return 0;
}
p1 = a + i, *p1 == a[i]) 이해b에 계산 결과를 저장하고 활용하는 흐름 파악a는 배열의 첫 번째 원소 주소와 동일한 포인터 상수처럼 동작.a + i는 &a[i]와 같고, *(a + i)는 a[i]와 같음.p1 = a + i; 후 *p1 == a[i].int b[3] = {};는 일부 컴파일러에서 모두 0으로 초기화하는 확장 문법입니다.int b[3] = {0}; 이며, 실제 계산에서는 곧바로 b[i-1]에 대입하므로 초기값이 결과에 영향은 없음.for (i; i < 4; i++)에서 i는 1부터 시작.b[i-1]를 쓰므로 인덱스는 0, 1, 2로 안전하게 접근.배열: a = {0, 2, 4, 8}
| i | p1 = a+i → *p1 | b[i-1] = *p1 - a[i-1] | a[i] | sum 누적식 | sum |
|---|---|---|---|---|---|
| 1 | a=2 | 2 | sum = 0 + 2 + 2 | 4 | |
| 2 | a=2 | 4 | sum = 4 + 2 + 4 | 10 | |
| 3 | a=4 | 8 | sum = 10 + 4 + 8 | 22 |
루프 종료 후 sum = 22.
22
이 문제에서 꼭 알아야 할 개념:
p1 = a + i; ↔ *p1 == a[i]b[i-1] = a[i] - a[i-1]가 되어, 결과적으로sum은 각 단계에서 b[i-1] + a[i] = (a[i]-a[i-1]) + a[i] = 2*a[i] - a[i-1]를 누적하는 형태.b[i-1])를 신경 쓰기 위해 초깃값 i=1이 중요.