📌 6.1 단원에서 나온 루프 말예요, "> 0" 검사를 빼면 좀 더 루프가 짧아지지 않나요? i가 0이 되면 루프는 멈출거고, 원래 사용했던 루프랑 동일하게 작동하잖아요.
while (i > 0) {
printf("T minus %d and counting\n", --i);
}
while (i) {
printf("T minus %d and counting\n", --i);
}
- 간결해보이지만, 몇 가지 단점이 존재함.
① 가독성이 떨어짐. 새 코드를 보면 i가 0이 되면 종료할 거라는 건 알겠지만, i를 통해 숫자를 증가하면서 수를 세고 있는 건지, 감소갛면서 수를 세고 있는 건지 불명확함.
② 새 코드는 만약 i가 루프가 실행될 때, 음수라도 되는 순간 원래 코드에서 의도한 방식대로 작동하지 않음. 원래 코드라면 바로 종료되겠지만, 새 코드는 바로 종료되지 않음.
📌 6.3 단원을 보니까 대부분의 경우 for문은 while문으로 공식처럼 치환이 될 수 있다고 하셨는데, 그럼 대부분이 아닌 경우는 뭐가 있나요?
// 1
n = 0;
sum = 0;
while (n < 10) {
scanf("%d", &i);
if (i == 0) {
continue;
}
sum += i;
++n;
}
// 2
sum = 0;
for (n = 0; n < 10; ++n) {
scanf("%d", &i);
if (i == 0) {
continue;
}
sum += i;
}
- 1을 2(for)로 치환함. 이게 근데 원래 코드랑 같은 코드는 아님.
- i가 0일 때, 원래 코드는 n을 증가시키지 않음. 반면, 새로 짠 코드는 n을 증가시킴.
📌 while (1)이랑 for(;;) 중에 어떤 게 더 나은 무한루프인가요?
- 보통 C 프로그래머들은 for (;;)을 더 선호함.
- 효율성 때문인데, 옛날 컴파일러들은 while문의 1 조건을 매번 검사하게 했음.
- 요즘 컴파일러들 기준으로 둘 사이에 성능 차이는 없음.
📌 프로그래머라면 continue문은 절대로 쓰면 안된다고 하던데, 정말인가요?
- 자주 사용하지 않는 건 맞지만, while문에서는 continue문을 나름 쓸만 함.
- 아래 예시) 입력값을 받는 루프. 입력값을 받았을 때, 유효한 값이면 어떤 처리를 해준다고 가정. 만약, 이 값이 유효한지 아닌지 판별하는 코드가 상당히 복잡하다면 continue문이 상당히 유용함.
for (;;) {
read data;
if (data fails first test) {
continue;
}
if (data fails second test) {
continue;
}
.
.
.
if (data fails last test) {
continue;
}
process data;
}
📌 goto문이 도대체 뭐가 안 좋다는 거예요?
- 안 좋다기 보다, goto문보다 더 나은 방법이 있어서 그럼. goto문을 여러 번 사용하면 '스파게티 코드'가 될 것.
- goto문은 코드의 특정 부분이 여러 목적을 수행하게 만들 수 있기 때문에, 수정하기 까다로움.
📌 null문이 루프의 본문을 비워주는 것 말고는 따른 용도가 없나요?
- 매우 적음.
- null문은 문법상 여러 군데에서 사용가능하기 때문에, 사용 가능성은 높음. 근데 실무에서는 본문 비우는 거 말고 드물게 발생하는 경우 딱 하나에만 사용함.
- 복합문 마지막에 라벨을 넣어야한다고 하자. 라벨은 혼자서는 사용할 수 없어요. 만드시 뒤에 구문이 따라와야함. 여기에 null문을 넣어주면 이 문제를 해결해줄 수 있음.
ed!{
…
goto end_of_stmt;
…
end_of_stmt: ;
}
📌 null문 말고는 빈 루프를 만드는 방법은 없나요?
- continue문을 사용하는 프로그래머들도 있긴 함.
for (d = 2; d < n && n % d != 0; ++d) {
continue;
}
- 빈 복합문을 사용하는 경우도 있음.
for (d = 2; d < n && n % d != 0; ++d) {
}
💡 본 내용은 K.N.King의 C Programming: A Modern Approach 책을 참고하였습니다.
'📚 STUDY > 🔥 C' 카테고리의 다른 글
[6-5] null문 (1) | 2024.09.11 |
---|---|
[6-4] 루프에서 벗어나기 (1) | 2024.09.11 |
[6-3] for문 (1) | 2024.09.05 |
[6-2] do문 (0) | 2024.09.05 |
[6-1] while (0) | 2024.09.05 |