2017-02-08 1 views
-3

궁금해을-동안-해야합니까 :C는 루프

do 
    --y; 
while (y - 3 != -1) 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 

는하지만 서면으로 시뮬레이션 할 수 있습니다

do 
    { 
    --y; 
    if (y - 3 != -1) // do-while-do 
     oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
    else 
     ; 
    } 
while (y - 3 != -1); 
+0

그래서 당신의 질문은 무엇입니까? 왜 안하는거야? 대부분의 언어에서 do while 루프의 표준 형식입니다! 그것은 디자인입니다. 같은 일을 할 것입니다 – minigeek

+2

"커피를 가져 오십시오."라고 쓰는 것이 당연합니다. 그러나 어떤 이유로 C는 그것을 이해하지 못합니다. 왜? –

+1

do-do-do-loop가있는 언어는 무엇입니까? (호기심이 생기고 그 전에 결코 만난 적이 없으며 첫 번째 코드가 무엇을 할 지 전혀 몰랐습니다.) – Mat

답변

0

for 루프를 사용하여 동일한 반복 값으로 y을 얻을 수 있습니다.

for(--y; y > 2; --y) { 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
} 
1

루프의 가장 자연스러운 구조에는 중간에 루프 조건자를 테스트해야한다는 불만이 있습니다. 실제로 C 나 내가 아는 어떤 다른 언어도 이것에 대한 구문 론적 지원을 직접적으로 가지고 있지는 않습니다 만, 그것을 구현할 수있는 많은 방법이 있습니다. 나는

--y; 
while (y - 3 != -1) { 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
    --y; 
} 

, 또는 @StoryTeller가 제시 한 유사 for 루프를 통해 귀하의 특정 코드를 작성하는 경향이있을 것이다. 그것은 루프 술어를 처음 테스트하기 전에 루프의 일부를 반복하지만, 그럼에도 불구하고이 경우에는 꽤 깨끗합니다. 당신은 모두 코드 중복을 피하려면

, 무리하지 않은, 당신은 중간에 루프 출구를 넣어 그것을 할 수 있습니다 :

while (1) { 
    --y; 
    if (y - 3 == -1) break; 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
} 

또는이 특정한 경우에

하지 일반적으로하지만, 술어 테스트에 선행하는 코드를 술어 테스트로 병합 할 수 있습니다.

while (--y - 3 != -1) { 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
} 
+1

두 번째 예제에서 테스트는 루프를 계속하기보다는 중단하기 때문에 테스트 조건을 반전시켜야합니다. – Dmitri

+0

@Dmitri, 고마워. –