- for문은 숫자를 세야하는 변수가 있을 때, 상당히 유용한 반복문임.
💡 for문 구조
for ( expr1 ; expr2 ; expr3 ) statement
// 예제
for (i = 10; i > 0; --i) {
printf("T 빼기 %d, 세는 중\n", i);
}
- 예제의 for문이 실행이 되면 변수 i는 10으로 초기화가 되고, i가 0보다 큰지 판별한다. 10은 0보다 크므로 T 빼기 %d, 세는 중 메세지가 출력되고, i는 감소된다. 그 다음 다시 i > 0을 판별한다. 여기서 i는 10부터 1까지 지속되므로 예제의 루프본문은 총 10번 실행된다.
📌 for문 관용적 표현
- 일정 횟수 or 구간에서 변수를 증감시키는 동안 반복할 때 매우 유용한 반복문임.
- 주로 n번 숫자를 세야할 때 for문이 사용됨.
💡 0에서 n-1까지
for (i = 0; i < n; ++i) …
💡 1에서 n까지
for (i = 1; i <= n; ++i) …
💡 n-1에서 0까지
for (i = n - 1; i >= 0; --i) …
💡 n에서 1까지
for (i = n; i > 0; --i) …
- > 대신 <를 사용하거나, 그 반대의 경우. 위의 관용구를 보면 알겠지만, 변수가 증가하는 경우에 < 혹은 <= 연산자를 사용하고, 변수가 감소하는 경우엔 반대로 > 혹은 >= 연산자를 사용한다.
- 제어식에서 <,<=,>,>= 연산자 대신 == 연산자를 사용하는 경우. 제어식은 루프가 실행되기 이전 참이어야하고, 이후에 루프가 종료될 수 있도록 거짓이어야한다. i == n와 같은 판별식은 전자의 경우에 참이 될 수 없기 때문에 무의미한 표현식이다.
- 제어식을 i < n 대신 i <= n으로 작성할 때 발생하는 "하나 부족한" 에러(Off-by-one Error. OBOE)의 경우.
📌 for문에서 표현식 생략하기
- 몇몇 for문의 경우, 굳이 모든 3개의 표현식이 필요하지 않은 경우가 있기 때문에 C언어는 for문의 표현식을 생략할 수 있게 해줌.
① 첫 번째 표현식 생략할 경우 ➡ 루프가 실행되기 이전 아무런 초기화도 일어나지❌
i = 10;
for (; i > 0; --i) {
printf("T 빼기 %d, 세는 중\n", i);
}
- for문 이전에 이미 i가 따로 할당자에 의해 초기화되었으니, 첫 번째 표현식을 생략해줌.
② 세 번째 표현식 생략할 경우 ➡ 루프 본문을 통해 두 번째 표현식이 언젠가는 거짓이 되게 만들어줘야 함.
for (i = 10; i > 0;) {
printf("T 빼기 %d, 세는 중\n", --i);
}
- 세 번째 표현식을 생략했기 때문에, 그 역할을 루프 본문 내에서 i를 감소시켜줌.
③ 첫 번째 표현식, 세 번째 표현식 생략할 경우 ➡ 사실상 for문을 뒤집어 쓴 while문인 셈.
for (; i > 0;) {
printf("T 빼기 %d, 세는 중\n", --i);
}
// 아래와 같음.
while (i > 0) {
printf("T 빼기 %d, 세는 중\n", --i);
}
- while문이 좀 더 의미가 명확해, while문으로 작성하는 것이 더 나음.
④ 두 번째 표현식 생략할 경우 ➡ for문은 이를 참값이라고 단정지어, for문이 종료되지 않음.
📌 C99에서의 for문
- for문의 첫 번째 표현식은 선언문으로 대체할 수 있음.
✅ 루프에서 사용할 변수를 선언하는게 가능하다는 뜻
for (int i = 0; i < n; ++i) {
…
}
- 변수 i는 for문 이전에 선언해줄 필요가 없음.
- for문 내에서 선언된 변수는 루프본문 밖에서 사용할 수 없음. (보통 찾을 수 없다고 표현)
- for문은 여러 개의 동일한 형식의 변수를 선언할 수 있음.
for (int i = 0, j = 0; i < n; ++i) {
…
}
📌 쉼표연산자
- 가끔 프로그래밍을 할 때, for문 내에 2개 (이상)의 표현식을 초기화하거나, 루프가 실행될 때마다 여러 변수를 증감시켜야 할 때가 있음. ➡ for문의 첫 번째와 세 번째 표현식 내에서 쉼표연산자를 통해 구현 가능함.
💡 쉼표식
expr1, expr2
- expr1, expr2는 임의의 표현식임.
- 쉼표식은 2가지 과정으로 평가됨. 우선, expr1이 평가되고, 그 값은 버려짐. 다음 expr2가 평가되며 그 값이 전체 표현식의 값이 됨. expr1을 평가할 땐, 언제나 부작용이 발생함. (부작용이 발생하지 않는다면, 애초에 expr1은 의미 없는 표현식임)
ex) 값이 각각 1과 5인 변수i와 j가 있다고 하자. 쉼표식 ++i, i + j이 평가된다면, 우선 i가 증가가 되고 나서 i + j이 평가될 것이다. 그렇기 때문에 전체 표현식의 값은 7이다. (당연하겠지만 i의 값은 2로 바뀌었을 것이다) 쉼표연산자의 순서는 다른 연산자보다 낮기 때문에 ++i와 i + j를 괄호를 치는 의미가 없다.
🌐 [프로그래밍] 제곱표 출력하기
🌐 square2.c
/* Prints a table of squares using a for statement */
#include <stdio.h>
int main(void)
{
int i, n;
printf("This program prints a table of squares.\n");
printf("Enter number of entries in table: ");
scanf("%d", &n);
for (i = 1; i <= n; ++i) {
printf("%10d%10d\n", i, i * i);
}
return 0;
}
💡 본 내용은 K.N.King의 C Programming: A Modern Approach 책을 참고하였습니다.
'📚 STUDY > 🔥 C' 카테고리의 다른 글
[6-5] null문 (1) | 2024.09.11 |
---|---|
[6-4] 루프에서 벗어나기 (1) | 2024.09.11 |
[6-2] do문 (0) | 2024.09.05 |
[6-1] while (0) | 2024.09.05 |
Q&A (들여쓰기 방식, switch 문 작성 방식) (0) | 2024.09.05 |