개인의 일부 코드를 살펴 보았는데 그의 기능에 패턴이있는 것 같습니다.
<return-type> function(<params>)
{
<initialization>
do
{
<main code for function>
}
while(false);
<tidy-up & return>
}
나쁘지 않고 더 독특합니다 (실제 코드는 상당히 깔끔하고 놀랍지 않습니다). 그것은 내가 전에 본 것이 아니며 누군가 그 뒤에있는 논리를 생각할 수 있는지 궁금했습니다.
답변
할 수 있습니다 break
아웃 do{...}while(false)
.
답변
많은 사람들이 “goto”를 쓰는 어색한 방법으로 break와 함께 자주 사용된다고 지적합니다. 함수에 직접 작성 되었다면 아마도 사실 일 것입니다.
매크로에서 OTOH do { something; } while (false)
는 매크로 호출 후 세미콜론을 강제 하는 편리한 방법이며, 다른 토큰은 절대 따라 올 수 없습니다.
또 다른 가능성은 한 번 거기에 루프가 있었거나 미래에 반복이 추가 될 것으로 예상된다는 것입니다 (예 : 테스트 기반 개발에서는 테스트를 통과하는 데 반복이 필요하지 않았지만 논리적으로 다음과 같은 경우에 루프하는 것이 합리적 일 것입니다. 기능은 현재 필요한 것보다 다소 더 일반적이어야 함)
답변
goto로서의 휴식이 아마도 답일 것입니다. 그러나 나는 다른 아이디어를 제시 할 것입니다.
아마도 그는 지역적으로 정의 된 변수를 갖고 싶었고이 구조를 사용하여 새로운 범위를 얻었습니다.
최근 C ++에서는 {...}
어디에서나 허용되지만 항상 그런 것은 아닙니다.
답변
함수에 대한 잠재적 인 종료 점이 많을 때 유용한 패턴으로 사용되는 것을 보았지만 함수가 종료되는 방법에 관계없이 항상 동일한 정리 코드가 필요합니다.
종료 지점에 도달 할 때마다 중단하고 나중에 나머지 논리를 인라인으로 처리함으로써 귀찮은 if / else-if 트리를 훨씬 쉽게 읽을 수 있습니다.
이 패턴은 goto 문이없는 언어에서도 유용합니다. 아마도 원래 프로그래머가 패턴을 배운 곳일 것입니다.
답변
나는 그런 코드를 보았으므로 일종의 break
것으로 사용할 수 있습니다 goto
.
답변
이것은 while
의 의미를 얻기 위한 변태 일뿐 입니다.goto tidy-up
goto라는 단어를 사용하지 않고 입니다.
외부 의 다른 루프 를 사용 하면 독자에게 모호해 지기 때문에 잘못된 형식 입니다. “이것이 출구로 가야하나요? 아니면 내부 루프를 벗어나기위한 것입니까?”while
breaks
답변
. break
대신 작성하는 것이 더 편리하다고 생각합니다 goto end
. 의도를 명확하게하는 레이블의 이름을 생각할 필요도 없습니다. 특정 이름을 가진 레이블로 이동하고 싶지는 않습니다. 여기서 나가고 싶어.
또한 어쨌든 중괄호가 필요할 가능성이 있습니다. 그래서 이것은 do{...}while(false);
버전입니다 :
do {
// code
if (condition) break; // or continue
// more code
} while(false);
그리고 이것이 사용하고 싶다면 표현해야 할 방법입니다 goto
.
{
// code
if (condition) goto end;
// more code
}
end:
첫 번째 버전의 의미를 이해하기 훨씬 쉽다고 생각합니다. 또한 작성하기 쉽고 확장하기 쉬우 며를 지원하지 않는 언어로 번역하기가 더 쉽습니다 goto
.
의 사용에 대해 가장 자주 언급되는 우려 break
는 심하게 위장 된 goto
. 그러나 실제로 break
는 다음과 더 유사합니다 return
. 두 명령어 모두에 비해 거의 구조화 된 코드 블록에서 튀어 나옵니다 goto
. 그럼에도 불구하고 두 명령어 모두 코드 블록에서 여러 개의 종료점을 허용하므로 때때로 혼란 스러울 수 있습니다. 결국 나는 특정 상황에서 가장 명확한 해결책을 찾으려고 노력할 것입니다.