while ( expression ) statement
The parentheses are MANDATORY
while (1) ...
: infinite loop
do statement while ( expression ) ;
The parentheses are MANDATORY
statement가 하나만 있어도 brace 씌워주는게 좋다.
왜냐하면 brace가 없으면 while statement로 보여질 수 있기 때문이다.
for ( expr1 ; expr2 ; expr3 ) statement
특별한 경우를 제외하면,
expr1;
while ( expr2 ) {
statement
expr3;
}
와 같다.
위에서 말하는 특별한 경우는?
ex)
n = 0;
while (n < 10) {
if ( i == 0 )
continue;
n++;
//continue 적용되면 여기로 jump
}
for(n = 0 ; n < 10 ; n++) {
if ( i == 0 )
continue;
//continue 적용되면 여기로 jump
}
이 둘은 다르다. i가 0일 경우, 위는 n을 증가시키지 않지만, 아래는 n을 증가시킨다.
for statement에서 두개의 semicolons은 무조건 있어야 한다. 하지만 expressions은 전부 없어도 OK.
for (;;) ...
: infinite loop (while문과 달리 조건을 1로 해주거나 할 필요 없음)
C99에선 for문의 expr1 위치에서 변수를 선언할 수 있도록 허용했다. (for(int a=0, b=1;...;...)... 처럼 여러 개도 선언 가능)
대신 선언한 변수는 해당 for문 내에서만 visible.
(나중에 보면 알겠지만, for문 자체가 하나의 block이기 때문)
expr1, expr2
expr1이 계산되고, discarded. 그 다음 expr2가 계산되고, 그 값이 expression의 값이 된다.
하나의 operator가 필요한 곳에서 여러 개의 opeators를 쓰고 싶을 때 유용하게 쓰임.
여러개의 statements를 하나의 statement로 보이게 하는 compound statement와 비슷함.
break;
It transfers control just past the end of a loop
continue;
It transfers control just before the end of a loop body
break는 switch에서도 쓰였지만, continue는 오직 loop에서만 쓰인다.
데이터를 계속 여러번 시도하며 읽거나 해야하는 경우 continue를 써주면 유용하다. (해당 사용 예시는 p.119 참고)
identifier : statement
goto identifier ;
함수 안에서 어디로든 점프할 수 있다.(무조건 같은 함수 안이어야 함.)
거의 사용은 안하지만(spaghetti code를 만들 수 있으므로 피하는게 좋음), loop안에 switch statement라던가 nested loop 같은 상황에서 빠져나오기 좋다.
;
semicolon만 있음.
empty body loop를 작성할 때 유용.
label은 뒤에 statement가 꼭 와야함. 그래서 label을 compound statement 제일 끝에 쓸 경우, 마지막에 null statement를 붙여줌.
empty body loop를 표현할 때는,
for(;;) ;
for(;;) continue;
for(;;) {}
세가지 방법을 사용할 수 있다.