2016-11-11 2 views
1
#include <stdio.h> 
int lcm(int ,int); 
int main() 
{ 
    int a,b,f; 
    printf("Enter the numbers:"); 
    scanf("%d %d",&a,&b); 
    f=lcm(a,b); 
    printf("LCM of %d and %d : %d",a,b,f); 
    return 0; 
} 

int lcm(int a,int b) 
{ 
    static int x=1; 
    if(x%a==0 && x%b==0) 
     return x; 
    x++; 
    lcm(a,b); 
} 

자,이 코드는 아무런 오류도주지 않고 있습니다 ... 그리고 올바른 답을 주지만 어떻게 lcm 함수의 키보드 반환없이 값이 주요 기능으로 돌아오고 있습니까? "lcm (a, b);" !! !! 설명 해주십시오 !!재귀 반환 함수에서 return을 사용하지 않으면 어떻게됩니까?

+7

정의되지 않은 동작이 발생합니다. –

+0

불행히도 반환 값은 main에서 사용됩니다. 이 동작은 a와 b가 둘 다 1 인 경우에만 정의됩니다. – 2501

+2

"이제이 코드는 오류를주지 않습니다."- 아니요. 그러나 C 경고는 똑같이 심각 할 것입니다! – Olaf

답변

1

자,이 코드는 아무런 오류도주지 않고 있습니다 ... 그리고 올바른 답을 주겠지 만 lcm 함수 lcm (a, b)에서 리턴 키보드없이 값이 주요 함수로 돌아 오는 방법;

C 언어는 잘못된 코드를 허용하며 사용자가 발을 쏠 수있게합니다. 이를 undefined behaviour이라고합니다. 코드는 (1,1)을 제외한 모든 인수에 대해 undfined 동작을 나타냅니다. 당신이 (1,1)을 통과하면 처음으로 첫 번째 반환이 시작됩니다.

예제에 대한 자세한 설명은 What Every C Programmer Should Know About Undefined Behavior을 읽어야합니다.

그렇다고해서 반환 값 자체를 무시하는 것은 정의되지 않은 동작이 아닙니다. 의 경우 호출자가 함수의 반환 값을 사용합니다. 예를 들어, 코드에서 scanf()printf() 함수의 반환 값을 이미 무시했지만 유효합니다. 그러나 의 반환 값 scanf()을 검사해야 스캔에 성공했습니다. 관련 메모에 오류가 발생하기 쉬운 scanf() use is discouraged in C입니다.

하지만 코드에서는 반환 값 (f=lcm(a,b);)을 사용합니다. 따라서 정의되지 않은 동작이 있습니다 (위에서 언급 한 예외가 있습니다).

하지만 당신은 주요 lcm()에 전화를 작성한다면 (이 프로그램에 유용하지 않습니다하지만)

scanf("%d %d",&a,&b); 
lcm(a,b); 
... 

후 어떤 정의되지 않은 동작이되지 않습니다.

+0

"호출자가 함수의 반환 값을 사용하는 경우에만 정의되어 있습니다."- 반환 값을 무시하는 것과 상관없이 값을 반환하지 않고 void가 아닌 함수를 호출하는 것은 * UB로 간주됩니다. 참조를 찾아 보겠습니다 .. –

+0

그래. 값이 무시되면 정상입니다. [표준] (http://port70.net/~nsz/c/c11/n1570.html#6.9.1p12)에는 다소 모호한 단락이 있습니다. * 함수를 종료하는}에 도달하면 값 함수 호출의 호출자가 사용하는 경우 동작은 정의되지 않습니다. * 흐릿한 것은'return' 문의 존재로 인해 조건 화되지 않기 때문입니다. –

+0

@EugeneSh. 나는 거기에 무엇이 흐릿한 지 보지 못한다. 6.9.1,12는 상당히 명확합니다. * "}는 함수에 도달 할 때까지 도달합니다. * (C++은"* 함수의 끝에서 벗어남 "*이라는 용어를 사용합니다) *)은 반환되는 함수에 return 문이 없음을 의미합니다. * return 문이있는 경우). –

관련 문제