팩토리얼 계산에서 이상한게 발견돼서 질문합니다!
조회수 1014회
1.
#include <stdio.h>
int main(void){
int a,i;
scanf("%d",&a);
for(i=1; i<a; i++)
{
a = a*i;
}
printf("%d",a);
return 0;
}
2.
#include <stdio.h>
int main(void){
int a,i;
scanf("%d",&a);
for(i=a-1; i>0; i--)
{
a = a*i;
}
printf("%d",a);
return 0;
}
만약 둘다 입력이 5일때
1번 코드와 2번코드 둘다 5~1까지 곱하는거는 다를게 없는데 결과가 다르게 나옵니다
1번코드는 -1899959296 가 나오고
2번코드는 정상적으로 120이 나오는데 이유를 모르겠어서 질문드립니다!
1 답변
-
혹시나 싶어서
-1899959296
으로 찾아봤는데 질문하고 계신 것과 너무나 똑같은 스택오버플로 질답이 이미 있었습니다.int a = 5; for (i=1; i<a; i++) { // <-- A a = a*i; // <-- B } // <-- C
이
for
는 다음과 같이 순회합니다.- A에 도달 -
i
= 1,a
= 5,i<a
는 참 - B에 도달 -
i
= 1,a
= 5 - A에 도달 -
i
= 2,a
= 5,i<a
는 참 - B에 도달 -
i
= 2,a
= 10 - A에 도달 -
i
= 3,a
= 10,i<a
는 참 - B에 도달 -
i
= 3,a
= 30 - A에 도달 -
i
= 4,a
= 30,i<a
는 참 - B에 도달 - ...
보시다시피 이 루프는 C에 절대 닿을 수가 없는데 왜냐하면
for
문 정의 안에 있는a
가 계속 변경되고 있기 때문입니다. 그래서 너무 큰 값이 찍혀버리는데 그 표현이-1899959296
인 거구요. (maxValue 어쩌고 하는 게 있는 모양인데 여기서부터는 제가 C를 몰라서 생략하겠습니다.)다음 코드가 정상 작동함을 확인해 보세요.
#include <stdio.h> int main(void) { int a, factorial; a = 5; factorial = a; // 이제 다음 for가 순회되는 동안 a는 변경되지 않는다. for (int i = factorial - 1; i > 0; i--) { // 반환될 값 factorial만이 루프에 의해 변경된다. factorial *= i; } // 출력: 120 ( = 5 * 4 * ... * 1) printf("%d", factorial); return 0; }
교훈: 예상치 않은 결과가 나오면 그대로 복사해서 설마 이것도 있겠냐 싶은 생각으로 구글에 넣어 봅시다.
- A에 도달 -
댓글 입력