C 반복 for 쉼표 - sonkoni/Koni-Wiki GitHub Wiki

for 구문과 쉼표

모호하고 짧은 표현은 필요없다. 한 줄 더 늘어나고 변수 하나 더 잡히더라도 명확한 것이 최고다.

쉼표 - 분리자 혹은 연산자

쉼표는 모양만 보면 분리자와 연산자가 구분이 안 된다. 쉼표가 연산자일 경우 왼쪽을 평가한 다음에 오른쪽을 처리한다. 쉼표 연산자는 다른 연산자들에 비해 우선순위가 가장 낮다.

// 여기서 콤마는 연산자이다. ++j가 성공하면 --i가 실행된다.
++j, --i;

// 여기서 콤마는 분리자이다. i와 j 가 개별적으로 int 로 선언된다.
int j, i;

// 여기서 콤마는 분리자이다. j = 0 이 할당되고, 그것의 성공 여부와 상관없이 i 는 -1 이 할당된다.
int j = 0, i = -1; 

// 여기서 콤마는 연산자이다. 
// 연산자로서 콤마는 우선순위가 낮기 때문에 k에는 10이 할당된다.
// 그렇지만 매우 안 좋은 표현이다.
int k = (5, 10);

// 다음의 경우 i=3; j=i+2; 와 일치한다.
// 이러한 형태는 가능하긴 하지만 별로 좋지 못하다.
int i,j;        // 분리자: i 와 j 가 각각 int 로 선언된다.
j = (i=3, i+2); // 연산자: i=3 처리 후 i+2 진행 후 j 에 할당.
// i는 3이며, j는 5가 된다.

for 에서 쉼표의 쓰임

쉼표는 for 의 초기식에는서는 분리자로 쓰이며, 변화식에서는 연산자로 쓰인다.

for (int i = 0, j = 0; i < 10; i++, j--) {
     ================          --------
      └▶ 분리자                   └▶ 연산자
}

초기식에 분리자로 들어가기 때문에 int i = 0, float j = 1.4f; ... ; ...와 같이 다른 타입의 중복선언 표현은 불가능하다.

#include <stdio.h>

int main(int argc, char *argv[]) {
    for(int i = 0, j = 10; i < 10; i++, j--) {
        printf("-> %d. World %d\n", i, j);
    }
    return 0;
}

\\ -> 0. World 10
\\ -> 1. World 9
\\ -> 2. World 8
\\ -> 3. World 7
\\ -> 4. World 6
\\ -> 5. World 5
\\ -> 6. World 4
\\ -> 7. World 3
\\ -> 8. World 2
\\ -> 9. World 1
⚠️ **GitHub.com Fallback** ⚠️