2013-02-01 2 views
2

고려하는 기능 foo() 그 수도 결코 종료 : 그것은 최종 리턴 문을 생략하는 유효한 C가

int foo(int n) { 
    if(n != 0) return n; 
    else for(;;); /* intentional infinite loop */ 

    return 0; /* (*) */ 
} 

인가? 마지막 문장을 생략하면 정의되지 않은 동작이 발생합니까?

+0

그것은 그것을 생략 컴파일러 경고를 줄 수 있습니다. –

+0

그 'return 0;'의 무엇이 잘못 되었나요? – deepmax

+0

@MM. 그것이 내가 알고 싶은 것입니다. – fuz

답변

3

는 더 UB 없다.

+0

정말요? C 표준을 인용 할 수 있습니까? ISO C99의 – fuz

+2

,이 6.9.1§12하다 "기능을 종료 그}에 도달 할 때, 함수 호출 값 발신자의 행동이 정의되지 의해 사용됩니다." – Virgile

+1

@ Virgile : 멋진 견적. 어디서 ISO-C99 온라인에 접속할 수 있습니까? – deepmax

3

당신은 무한 루프 이후 지난 return 한 Statment를 생략 할 수 있습니다. 그러나 모든 경로가 돌아 오지 않는 것처럼 편집 경고를받을 수 있습니다. 함수에 무한 루프가있는 것은 좋지 않습니다. 루프를 깰 수있는 하나의 조건을 유지하십시오. 그 무한 루프가 정말이 경우에 필요한 경우

어쨌든 그 후 return 문은 죽은 코드입니다. 그것을 제거하면 무한 동작이되지 않습니다. 이 return 문없이 돌아 않더라도 당신이 반환 값을 사용하지 않는

+0

이 예에서는 무한 루프가 의도적입니다. – fuz

+0

내 대답 업데이트 – rashok

1

void 기능이 없으면 return 문을 전혀 사용하지 않거나 모든 경로가 return 문을 가지고있는 것은 유효합니다. 예를 들어

:

// This is a valid function definition. 
int foo(void) 
{ 
} 

또는

// This is a valid function definition. 
int bar(void) 
{ 
    if (printf("")) 
    { 
     exit(1); 
    } 

    return 0; 
} 

하지만 foo의 반환 값을 판독하는 동작이 정의된다.

foo(); // OK 
int a = foo(); // Undefined behavior 
int b = bar(); // OK