for
하나가 아닌 루프 조건 에서 두 개의 변수를 증가시키고 싶습니다 .
그래서 다음과 같습니다.
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
이것에 대한 구문은 무엇입니까?
답변:
일반적인 관용구는 두 피연산자를 모두 평가하고 두 번째 피연산자를 반환하는 쉼표 연산자 를 사용하는 것 입니다. 그러므로:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
이제 그 글을 쓴 어떤 주석가는 그것이 실제로 쉼표 연산자가 아니라 for 문에있는 특별한 구문 설탕이라고 제안했습니다. GCC에서 다음과 같이 확인했습니다.
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
x가 a의 원래 값을 가져 오기를 기대했기 때문에 x에 대해 5,6,7 ..이 표시되어야합니다. 내가 얻은 것은
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
그러나 구문 분석기가 실제로 쉼표 연산자를 보도록하기 위해 표현식을 괄호로 묶으면
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
처음에는 이것이 쉼표 연산자로 작동하지 않는다는 것을 보여 주었다고 생각했지만, 이것은 단순히 우선 순위 문제입니다. 쉼표 연산자는 가능한 가장 낮은 우선 순위 를 가지므로 x = i ++, a ++ 표현식은 효과적으로 (x = i ++), a ++로 구문 분석 됨
모든 의견을 보내 주셔서 감사합니다. 흥미로운 학습 경험이었고 저는 수년 동안 C를 사용해 왔습니다!
이 시도
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
. 컴파일러가 더 이상 "증가"연산이 아니라고 생각하도록하는 추가 괄호 속임수입니다.
하지 마십시오!
에서 http://www.research.att.com/~bs/JSF-AV-rules.pdf :
AV 규칙 199
for 루프의 증분 표현식은 단일 루프 매개 변수를 루프의 다음 값으로 변경하는 것 외에 다른 작업을 수행하지 않습니다.근거 : 가독성.
저는 FOR 루프의 증분 절에 두 번째 인덱스를 코딩하는 방법을 상기하기 위해 여기에 왔습니다. 주로 C ++로 작성된 다른 프로젝트에 통합 한 샘플에서이를 관찰하여 수행 할 수 있다는 것을 알고있었습니다.
오늘 저는 C #으로 작업하고 있지만 FOR 문은 모든 프로그래밍에서 가장 오래된 제어 구조 중 하나이기 때문에 이와 관련하여 동일한 규칙을 따를 것이라고 확신했습니다. 고맙게도 저는 최근에 이전 C 프로그램 중 하나에서 FOR 루프의 동작을 정확하게 문서화하는 데 며칠을 보냈으며 그 연구에서 오늘날의 C # 문제, 특히 두 번째 인덱스 변수의 동작에 적용되는 교훈이 있다는 것을 금방 깨달았습니다. .
다음은 내 관찰에 대한 요약입니다. 오늘 내가 본 모든 일은 Locals 창에서 변수를주의 깊게 관찰함으로써 C # FOR 문이 C 또는 C ++ FOR 문과 똑같이 작동한다는 내 기대를 확인했습니다.
루프가 끝날 때 인덱스 변수 중 하나가 범위에 남아 있으면 해당 값은 실제 인덱스 변수의 경우 루프를 중지하는 임계 값보다 하나 더 높습니다. 마찬가지로, 예를 들어 두 번째 변수가 루프에 들어가기 전에 0으로 초기화되면 마지막 값은 감소가 아닌 증가 (++)이고 루프의 본문은 값을 변경합니다.
나는 squelart에 동의합니다. 두 변수를 증가시키는 것은 버그가 발생하기 쉬우 며 특히 그중 하나만 테스트하는 경우 더욱 그렇습니다.
다음은이를 수행하는 읽기 쉬운 방법입니다.
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
루프는 하나의 증가 / 감소 변수에서 루프가 실행되는 경우를 의미합니다. 다른 변수의 경우 루프에서 변경하십시오.
j
연결 해야하는 경우 i
원래 변수를 그대로두고 추가하지 않는 이유는 i
무엇입니까?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
논리가 더 복잡한 경우 (예를 들어 실제로 둘 이상의 변수를 모니터링해야 함) while
루프를 사용합니다 .
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
과 a
루프에 지역은?
수학을 사용하십시오. 두 연산이 수학적으로 루프 반복에 의존한다면 왜 수학을하지 않습니까?
int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
do_something (counter+i, counter+j);
또는 더 구체적으로 OP의 예를 참조하십시오.
for(int i = 0; i != 5; ++i)
do_something(i, j+i);
특히 값으로 함수에 전달하는 경우 원하는 것을 정확히 수행하는 무언가를 얻어야합니다.