2014-04-11 3 views
1

하나의 입력을받는 함수를 작성하는 방법, 반복 할 횟수에 대한 최대 횟수를 계산하는 방법이 있는지 궁금합니다. 수를 사용하지 않고, 음수 인 경우 무한 루프는 IF-다른무한 루프 또는 if-else를 사용하지 않고 한도까지 루프

void func(int nAttempts) // if nAttempts <= 0, do an infinite loop 
{ 
    if (nAttempts <= 0) 
    { // do an infinite loop 
    } 
    else 
    { // do a loop up to nAttemtps 
    } 
} 

내가 할 수있는 방법이 있는지 알고 싶습니다한다는 경우 - 다른

+0

무한 루프가 필요한 이유는 무엇입니까? 'while (true) {}'? – taocp

+0

.. 비논리적 인 ... 그냥 normaly를 반복하고, 무한 루프를 원한다면 "for (;;)"또는 "while (true)"을 사용하십시오. –

+0

'if'의 문제점은 무엇입니까? –

답변

9

while ((nAttempts < 0) || (nAttempts-- > 0)) {...}

을하지 않고

하지만 ... 왜? 이렇게하면 코드를 읽기 쉽게 만들어줍니다. if/else은 의도가 무엇인지 명확하게 보여줍니다.

+1

+1 단락. – WhozCraig

+0

예, 좋은 해결책 – 4pie0

+0

그래, 이건 좋은거야, 내가 지정하지는 않았지만 C++ 용이고 C++는 단락을 이용한다. Craig는 지적했다. – riqitang

-1

예 :

void func(int nAttempts) // if nAttempts <= 0, do an infinite loop 
{ 
    while(nAttempts--) // do an infinite loop 

} 

또한 매우 낮은 음수 루프 내부 검사를 추가하고 -1로 재설정 할 수 있습니다.

+0

니스! 그래서 nAttempts가 양수이면 0이 될 때 멈추고, 음수이면 영원히 계속됩니다. 훌륭한 직업, 고마워! – riqitang

+5

이것은 음수 인 param이 전달되면 결국 언더 플로우가되고 결국 종결됩니다. – WhozCraig

+1

그리고 세미콜론이 없다 – 4pie0

0
void func(int nAttempts) 
{ 
    while (nAttempts) 
    { 
     // do stuff 
     --nAttempts; 
    } 
} 

기본적으로 모든 반복 끝에 하나의 '시도'가 삭제됩니다. 0에 도달하면 당신은 멈 춥니 다. 이미 부정적으로 시작했다면, 점점 부정적이 될 것입니다.

5

나는 이것이 어떤 종류의 트릭 질문인가? 여기에 내 걸릴입니다 :

void f(int n) 
{ 
    n < 0 ? []{ while(true); }() : [&]{ while(n--); }() ; 
} 
+0

포스터가 의도 한 것이 아닐지 모르겠지만 아마도. :) 어쨌든 +1을 드리겠습니다. – M2tM

+0

트릭 질문이 아니라 호기심입니다. 좋은 답변이 많이 주어지면 아마도 가장 혼란 스러울 것입니다 : P – riqitang

+0

@Sean 그는 if 문 대신 ** 3 항 연산자 **를 사용하고 ** C++ lambdas **는 ** 연산자 () ** (또는 ** 호출 연산자 **). 호기심이라면 그 용어를 구글로 볼 수 있습니다. – M2tM

4

자체가 그것의 조건부 내부를 가지고 루프,이 경우 명시 적 아니지만, 그것은 branch이다. 그 표현의 실제 평가는 lazy evaluation으로 인해 완성됩니다. 결과적으로, if 문 없이도 조건문이 계속 발생하기 때문에이 질문은 무의미합니다. 그러나 귀하의 질문에 대한 답은 다음과 같다 :

void optionalInfiniteLoop(int nAttempts){ 
    while(nAttempts < 0 || nAttempts-- != 0){ 
     ... 
    } 
} 

게으른 평가를이 보면 이해, nAttempts는 < 0 먼저 평가됩니다. 그것이 사실이라면, || 실행해야 할 필요가 없으므로 너무 멀리 뺄 때 int를 감싸지 않습니다. 거짓이면 nAttempts가 0이 될 때까지 while 루프의 두 번째 부분을 평가합니다. 이렇게하면 아무 것도 저장할 수 없다고 생각합니다. 실제로 컴퓨터를 강제로 수행해야 할 수도 있습니다 약간 nAttempts < 0을 단지 한 번만하는 대신 반복하여 확인하십시오.

성능은 응용 프로그램의 맥락에서 거의 확실하게 측정되지 않을 것이며 위의 내용이 더 깨끗해 보입니다. 그러나 기술적 인 것보다는 실제로 스타일이 더 많습니다.

+0

컴퓨터가 좋은 점은 nAttempts <0을 한번만 계산하는 대신 매번 0보다 작게 평가하는 것입니다. – riqitang

+0

자동으로 더 비싸다고 가정 할 때 조심스럽게 예측할 수 있습니다. 컴파일러 최적화. – M2tM