#include <stdio.h>
int sum(int n)
{
if (n == 1)
return 1;
return n +sum(--n); // 여기에서 --n으로 하니 결과값이 다르게 나옵니다. --n이나 n-1이나 같은 거 아닌가요?
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", sum(n))
return 0;
}
sum(n - 1) -> sum(4) 호출, n = 5
sum(--n) -> sum(4) 호출, n = 4
n의 값에 차이가 있습니다.
또한, n + sum(--n)처럼 앞에 n이 있습니다.
앞의 n 값에도 영향을 주게 됩니다.
C 언어에서는 식이 평가되는 지점을 시퀀스 포인트(sequence point)라고 합니다. n + sum(--n)은 식이 평가되는 지점이 두 곳입니다. n과 sum(--n)입니다.
n + sum(n - 1)에서 n은 두 곳에서 모두 5
n + sum(--n)에서 n은 한 곳에서는 5, 한 곳에서는 4 -> 시퀀스 포인트 위반
이 사이에 n의 값이 바뀌는 것은 시퀀스 포인트 위반입니다. 시퀀스 포인트를 위반한 경우 C 언어 표준에서는 동작을 정의하지 않았습니다. 따라서 C 언어 컴파일러에 따라 동작할 수도 있고, 안 할 수도 있고, 결괏값이 다를 수도 있습니다.
상당히 많은 C 언어 교재에서는 다음과 같은 문제를 내곤 합니다.
i = 5
i = i++ + ++i; // i의 값은?
이는 시퀀스 포인트 위반으로 컴파일러마다 결괏값이 달라지며, C 언어 표준에 위배됩니다. 따라서 올바르지 않습니다.
시퀀스 포인트는 중급 이상의 내용으로 어려우며, 대다수 C 언어 입문서에는 언급조차 되어 있지 않습니다만, C 언어를 제대로 쓰려면 알아야 하는 개념입니다. 자세한 내용은 85.17 시퀀스 포인트를 참고하세요.