C 반복 for 쉼표 - sonkoni/Koni-Wiki GitHub Wiki
모호하고 짧은 표현은 필요없다. 한 줄 더 늘어나고 변수 하나 더 잡히더라도 명확한 것이 최고다.
쉼표는 모양만 보면 분리자와 연산자가 구분이 안 된다. 쉼표가 연산자일 경우 왼쪽을 평가한 다음에 오른쪽을 처리한다. 쉼표 연산자는 다른 연산자들에 비해 우선순위가 가장 낮다.
// 여기서 콤마는 연산자이다. ++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 (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