본문 바로가기
📚 STUDY/🔥 C

[6-3] for문

by 엄지잉 2024. 9. 5.

- 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) {
    &#8230;
}

 

 

📌 쉼표연산자

- 가끔 프로그래밍을 할 때, 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