2013-08-19 1 views
0

저는 정말 빠른 질문이 있습니다. 더 "표준"으로 사용할 수 있습니까? 함수를 이동하거나 반환합니까?goto는 C 프로그래밍의 하위 메뉴와 메뉴로 돌아갑니다.

고토 예 :

main(){ 
    start: 
    //some code 
    goto start; 
} 

main(){ 
    //some code 
    return main(); 
} 

의지 루프 스크립트 모두. 하지만 어느 것이 더 사용하기에 적합한 지 궁금합니다.

goto가 정말 좋은 것처럼 보이지만 사용하는 데 단점이 있습니까? (나는 Goto 기능 때문에 동료 강사가 실패했기 때문에 궁금해하고 있습니다. 이유가 궁금합니다. 또는 그가 한 일이 합리적이었습니다.)

왜이 질문에 대답할까요? 하위 메뉴가있는 메뉴를 만들려면 하위 메뉴에 "뒤로"옵션이 포함되어 있어야합니다.

+3

둘 다 다르며, 두 번째 스택 오버플로가 발생할 수 있지만 첫 번째 스택 오버플로가 발생할 수 있습니다. – Rohan

+2

두 번째는 스택 오버플로를 유발할 것입니다. 왜냐하면 여러분은 단지 재귀 적으로 끝 조건없이 스스로를 호출하기 때문입니다. 그것이 상황에 정말로 달려 있다는 것 이외에, 당신이 이것을 왜하고 싶은지에 대해 자세히 설명해 주실 수 있습니까? –

+0

@Rohan 유용한 정보였습니다 .. 감사합니다! –

답변

10

여기서 합리적인 일은 루프를 사용하는 것입니다. goto과 같은 효과가 있지만 이전에 일반적이지 않은 유지 보수가 불가능한 국수 스프레드 프로그래밍과는 대조적으로 structured programming의 규칙을 따르므로 더 나은 관행으로 간주됩니다.

int main(void) { 
    while (1) { 
     //some code 
    } 
} 

재귀 적으로 함수를 호출하는 것은 재귀에 잘 정의 된 제한이있는 경우 좋은 스타일로 간주 될 수 있습니다. 컴파일러가 꼬리 - 호출 최적화를 구현하는 컴파일러가 거의 없으므로 C에서 무제한 재귀는 일반적으로 스택 오버플로 오류를 발생시킵니다.

+0

나는이 아이디어를 고려할 것이다. 그러나 내가 실제로 만들고자하는 것은 프로그램에 메인 메뉴와 서브 메뉴가있는 백 메뉴이다. 하위 메뉴에는 주 메뉴로 돌아갈 수있는 "뒤로"옵션이 있습니다. –

+1

메뉴에 대한 기능을 만들고 하위 메뉴에 대한 기능을 만듭니다. 각 기능에는 루프가 있습니다. 하위 메뉴에 대한 함수를 호출하여 하위 메뉴에 들어갈 수 있습니다. 사용자가 "exit"또는 "back"옵션을 선택하면 루프를 종료하십시오. – Joni

+0

정의되지 않은 동작에 대한 참조가 있습니까? C++ 용으로 문서화 된 방법을 찾을 수는 있지만 꽤 게으르다. – sh1

0

break을 사용하여 돌아 가기 힘든 깊은 중첩 루프가있는 경우 goto을 사용해야합니다. 예를 들면.
main에서 return을 사용하면 주 기능이 끝나고 컨트롤이 OS로 반환됩니다.

귀하의 goto- 구현이 무한 루프를 유발하고 반환과 동일한 성과를 달성하지 못합니다. 또한 직접 또는 간접적으로 main()으로 전화해서는 안됩니다.

무한 루프를 사용하여 실현 될 것입니다 중 하나

for(;;) 

또는

while(1) 

이 더 일반적이다,하지만 당신은 명시 적으로 루프에서 임의의 break를 호출하지 않는 경우 프로그램이 종료하지 않습니다.

+0

@JoachimPileborg 그 한 가지 가능성이 있습니다. 그러나 때로는 깊은 중첩 구조가있는 드라이버 프로그래밍을 고려하고 올바르게 정리해야합니다. –

+0

거기에 고토를 던지기보다는 루프를 이해하고 제대로 끝내는 것이 더 합리적이지 않습니까? 내 말은, 당신은 아마도 그 루프를 복잡한 이유로 만들었고, goto는 무언가를 폭발 시키거나 누군가 코드를 읽을 때 누군가를 폭발시킬 것입니다. – Fenixp

+0

이것은 단지 예일뿐입니다. 물론'goto'를 피해야합니다. 그리고 아마도 대부분 다른 시간에 다른 해결책이있을 것입니다. 그러나 때때로 드라이버/커널 프로그래밍에서 중첩 된 구조를 쉽게 풀 수있는 방법입니다. –

3

goto은 피해야합니다. 그것을 사용하는 것은 나쁜 습관으로 간주됩니다. 코드를 읽고 이해하기가 더 어렵 기 때문입니다.

저는 return main();이 정확하다고 생각하지 않습니다. 내 생각에 매우 추악하고 안전하지 않습니다.

무한 루프를 수행하는 더 좋은 해결책은 while(1) 또는 for(;;)을 사용하는 것입니다.

1

는 당신이 필요 무엇을 고려, 루프 및 기능 트릭을 할 것입니다 : 당신은 컴파일러가 추가 스택 프레임을 최적화 것이라는 점을 보장 할 수 없기 때문에

void submenu(void) 
{ 
    for (;;) 
    { 
     printf("a: Do something else\n"); 
     printf("b: Leave sub menu\n"); 

     char choice; 
     scanf(" %c", &choice); 
     if (choice == 'a') 
      do_something_else(); 
     else if (choice == 'b') 
      break; /* Break out of loop */ 
     else 
      printf("Invalid choice.\n"); 
    } 

    /* When this function returns, you get back to the main menu */ 
} 

void mainmenu(void) 
{ 
    int goon = 1; 

    while (goon) 
    { 
     printf("1: Do something\n"); 
     printf("2: Enter sub-menu\n"); 
     printf("3: Exit\n"); 

     char choice; 
     scanf(" %c", &choice); 

     switch (choice) 
     { 
     case '1': 
      do_something(); 
      break; 

     case '2': 
      /* Enter the sub-menu */ 
      submenu(); 
      break; 

     case '3': 
      goon = 0; /* This will cause the loop to end */ 
      break; 

     default: 
      printf("Invalid choice.\n"); 
      break; 
     } 
    } 
} 

int main(int, char **) 
{ 
    mainmenu(); 
    return 0; 
} 
+0

복사하고 붙여 넣기가 더 쉬울까요? 그래 맞아. – Gandaro

0

return main() 아마 좋은 생각이다. 컴파일러가이 작업을 수행하지 못하면 루프가 반복 될 때마다 스택이 계속 커집니다.

로컬 변수를 다시 초기화하지만 루프 구성 안에 해당 변수를 넣어도 동일한 효과를 얻을 수 있습니다.

goto에는 코드가 있지만 실제로는 그렇지 않습니다. 루프를 만들고 싶다면 루프 구조가 있습니다. 대신 for (;;) { /* some code */ }을 사용하십시오.

관련 문제