2013-05-06 3 views
3

while 루프 내부의 조건이 0, 즉 항상 거짓 인 경우 do while 루프의 중요성은 무엇입니까?do()의 중요성 while (0)

do 
{ 

//some code implementation. 

}while(0); 

나는 여러 곳에서 사용되는 것을 보았다. 그 중요성은 무엇입니까, 우리는 do (0)을 생략합니다. 양방향 코드는 한 번만 실행됩니다.

while (0) 조건의 사용에 관해서는 일반적인 do-while 루프가 아니라는 질문에 대해 중복되지는 않습니다.

+3

매크로가 아닌 경우 작성자가 블록의 끝으로 건너 뛰려면 '중단;'을 사용할 수 있도록해야합니다. 어떤 사람들은 비용에 관계없이 '고토'를 피하려고합니다. –

+0

간단한 구글 검색은 당신에게 대답을 가져 왔을 것입니다 – phaazon

+2

@levengli : 아니요, 그것은 중복이 아닙니다. Daniel : java와 같은 일부 언어에는 "goto"키워드가 없으므로 특정 지점으로 건너 뛰려면 레이블이있는 구분 또는 do/while 중 하나를 사용해야합니다. 레이블이있는 구분 구.이 혼동을 줄 수 있으므로 마지막 것이 바람직합니다. –

답변

2

이 코드는 함수를 벗어나지 않고도 특정 범위의 코드를 남겨 두는 데 사용할 수 있습니다. 고려 :

내가 하나가 원자 고려되어야하는 일련의 작업을해야하는 경우 특히,이 받아 들일 수 있다고 말을하는 경우가 있습니다
do 
{ 
    beginAtomicOperationSequence(); 

    ret = doSomething(); 
    if (ret < 0) break; 

    ret = doSomething2(); 
    if (ret < 0) break; 

} while(0); 

if (ret < 0) { 
    switch (ret) { 
    //handle error 
    } 
    rollbackAboveOperations(); 
} else { 
    commitAboveOperations(); 
} 

. 위의 예와 같습니다.

+1

"* ... 좋지 않은 연습 ... *": 계단식'if (...) if (...) ... '가 가치 있고,'goto's가 더 나 빠지다. ! – alk

+0

@alk 가치가 있습니까? 보다 나쁜? 어쨌든 제가 말했듯이, 이것이 받아 들일 수있는 경우가 있습니다. 계단식 ifs가 코드 가독성면에서 훨씬 나쁘다. – Dariusz

+0

@Dariusz : 좋은 연습이 아니라면 대안은 무엇입니까? –

2

호출 코드에서 세미콜론과 중괄호를 사용하는 방법에 관계없이 매크로가 항상 동일하게 작동하도록합니다. 자세한 내용은

그 맥락에서 this

0

do { } while(0) 구조를 참조 사실을 작성하지 않고 고토의 쓰기 위해 난독 방법입니다. 그것은화물 숭배 프로그래머들이 사용하는데, 어딘가에는 그 결함들이 나쁘다고 읽었지만 그 이유를 이해하지 못했습니다.

여기 Dariusz의 대답은 적절한 goto과 의미있는 레이블로 다시 작성되었습니다.

beginAtomicOperationSequence(); 

    ret = doSomething(); 
    if (ret < 0) goto handle_error; 

    ret = doSomething2(); 
    if (ret < 0) goto handle_error; 

    ... 

handle_error: 
    if (ret < 0) { 
    switch (ret) { 
    //handle error 
    } 
    rollbackAboveOperations(); 
    } else { 
    commitAboveOperations(); 
    } 

보다 명확하고 명백한 것처럼. 그 구조의 목적을 물어야한다는 것조차도 그것이 이라는 나쁜 아이디어임을 보여줍니다.

나는 내 대답에 격렬하다. 나는 우리 프로젝트에서 그것을 사용하고 남용하는 동료가 있기 때문에 나는 그것에 대한 1 개의 재치있는 가치를 발견하지 못했다. 믹스에서 실제 루프를 추가 할 때 더욱 귀찮습니다. 그러면 재미가 시작되어 breakcontinue으로 연결됩니다.

편집 : 여기에 링크 된 Linus Torvald의 goto에 대한 호언 장담. http://kerneltrap.org/node/553/2131

+0

이 코드는 좋지 않습니다. 고토 때문이 아니야. 'handle_error'는 에러를 처리해야하며, 모두 ok 일 경우 커밋을 수행하지 않습니다. 올바른 방법은 * 모두 OK * normal return 문 다음에 handle_error를 넣는 것입니다. – Dariusz

+0

동의어 :이 대답은 질문과 아무 관련이 없습니다. 삭제해야합니다. – Dariusz

+0

그리고 2 센트를 더할 수 있다면 구문 하이라이팅을 사용하더라도 쉽게 관찰 할 수 있고 디버거 단계 동작이 정의되어 있지 않기 때문에 한 줄로 된 ifs를 싫어합니다. –