C의 풀 "for" 루프 구문은 무엇입니까?
난 아주 이상한 걸 봤어for
다른 사람의 코드를 읽을 때 루프합니다.다음 구문에 대한 자세한 설명을 검색하려고 했습니다.for
C를 반복하지만 "for"라는 단어가 관련 없는 문장에 나타나 구글에서 검색이 거의 불가능하기 때문에 매우 어렵습니다.
이 글을 읽고 나서 이 질문이 떠올랐는데 다시 한 번 더 궁금해졌다.
그for
여기:
for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);
중간 조건에는 두 개의 코드를 구분하는 쉼표가 있습니다. 이 쉼표는 무엇을 합니까?오른쪽의 쉼표는 양쪽 모두를 만들기 때문에 이해한다.a>>=1
그리고.b<<=1
.
하지만 루프 출구 상태에서는 어떻게 됩니까?다음 시간에 종료됩니까?p==0
,언제a==1
아니면 둘 다 일어날 때?
누가 이걸 이해하는데 도움을 줄 수 있다면 얼마나 좋을까?for
루프 구문에 대한 설명입니다.
콤마는 루프의 경우 제외되지 않으며 콤마 연산자입니다.
x = (a, b);
는 먼저 a, 다음으로 b, 다음으로 x를 b의 값으로 설정합니다.
의 구문은 다음과 같습니다.
for (init; condition; increment)
...
어느 정도(무시)continue
그리고.break
현시점에서는, 이하에 상당합니다.
init;
while (condition) {
...
increment;
}
따라서 for 루프의 예는 (다시 한 번 무시)입니다.continue
그리고.break
)에 상당합니다.
p=0;
while (p+=(a&1)*b,a!=1) {
...
a>>=1,b<<=1;
}
마치 무시한 것처럼 행동한다(다시 말하지만continue
그리고.break
):
p=0;
while (true) {
p+=(a&1)*b;
if (a == 1) break;
...
a>>=1;
b<<=1;
}
위의 while 루프로의 간이 변환에는 포함되지 않은 for 루프의 2가지 추가 상세 정보:
- 조건이 생략되면 항상 다음과 같습니다.
true
(무한 루프로 동작하는 경우는,break
,goto
또는 다른 무언가가 루프를 파괴합니다). - A
continue
인크리먼트 직전에 라벨에 대한 goto인 것처럼 행동합니다.continue
while 루프에서는 증가분을 건너뜁니다.
또한 쉼표 연산자에 대한 중요한 세부 사항은 다음과 같은 시퀀스 포인트입니다.&&
그리고.||
(따라서 다른 문장으로 나누어 의미를 그대로 유지할 수 있습니다).
C99의 변경
C99 규격에서는 이 설명에서 앞서 설명하지 않은 몇 가지 뉘앙스가 도입되어 있습니다(C89/C90에는 매우 적합합니다).
첫째, 모든 루프는 그 자체로 블록입니다.사실상,
for (...) { ... }
교정기로 감싼다.
{
for (...) { ... }
}
표준에는 다음과 같이 기술되어 있습니다.
ISO/IEC 9899:1999 § 6.8.5 반복문
5 반복문은 해당 범위가 해당 블록의 범위 중 엄밀한 부분 집합인 블록입니다.루프 본문은 반복문 범위의 엄밀한 서브셋인 블록이기도 합니다.
이는 추가 가새 세트의 관점에서 이론적 근거에도 설명되어 있습니다.
둘째,init
C99의 부분은 (단일) 선언일 수 있습니다.
for (int i = 0; i < sizeof(something); i++) { ... }
이제 '루프를 둘러싼 블록'이 그 자체로 나타납니다.그것은 변수가 왜i
루프 외부에서는 액세스 할 수 없습니다.여러 변수를 선언할 수 있지만 모두 동일한 유형이어야 합니다.
for (int i = 0, j = sizeof(something); i < j; i++, j--) { ... }
표준에는 다음과 같이 기술되어 있습니다.
ISO/IEC 9899:1999 § 6.8.5.3 스테이트먼트용
스테이트먼트
for ( clause-1 ; expression-2 ; expression-3 ) statement
는 다음과 같이 동작합니다.expression-2는 루프 본체의 각 실행 전에 평가되는 제어식입니다.표현식-3은 루프 본체의 각 실행 후에 void 표현으로 평가됩니다.clause-1이 선언인 경우 선언된 변수의 범위는 선언의 나머지 부분과 다른 두 식을 포함한 루프 전체입니다.이 범위는 제어식의 첫 번째 평가 전에 실행 순서로 도달합니다.절-1이 식이면 제어식의 133)첫 번째 평가 전에 무효식으로 평가된다.
절-1과 식-3은 모두 생략할 수 있습니다.생략된 식-2는 0이 아닌 상수로 대체됩니다.
133)그러므로 clause-1은 루프당이 루프에 사용하기 위해서 한 이상 변수 선언, 지배적인 표현, expression-2까지 표현 0과 동일한 비교해 보는 것은 루프의 실행을 계속하고;그리고 expression-3 등에 작업을 지정하는 평가 반복할 때마다 전에 만들어진, 그러한를 지정하는 초기화를 지정합니다.crementing)이 각 반복 후에 수행됩니다.
쉼표는 단순히 두 식을 구분하며 정규 표현이 허용되는 C의 모든 위치에서 사용할 수 있습니다.이것들은 왼쪽에서 오른쪽으로 순서대로 실행됩니다.맨 오른쪽 식 값은 식 전체의 값입니다.
for
루프는 3개의 부분으로 구성됩니다.이것들 중 어느 것도 비어 있을 수 있습니다.하나는 처음에 실행되며 다른 하나는 각 반복의 마지막에 실행됩니다.이러한 부품은 보통 카운터를 각각 초기화 및 증가시키지만, 모든 작업을 수행할 수 있습니다.
두 번째 부분은 각 실행 시작 시 실행되는 테스트입니다.테스트 결과가 나오면false
루프가 중단됩니다.그게 다예요.
루프의 C 스타일은 다음 3가지 표현으로 구성됩니다.
for (initializer; condition; counter) statement_or_statement_block;
- 이니셜라이저는 루프가 시작되면1회 실행됩니다.
- 이 조건은 반복할 때마다 체크됩니다.루프는 true로 평가되는 한 계속 실행됩니다.
- 카운터는 반복 후 1회 실행됩니다.
이러한 각 부분은 루프를 쓰는 언어로 유효한 표현일 수 있습니다.그것은 그것들이 더 창의적으로 사용될 수 있다는 것을 의미한다.루프에 본체가 없어질 때까지 미리 하고 싶은 것은 이니셜라이저에 넣을 수 있습니다.또, 그 사이에 하고 싶은 것은 모두 조건이나 카운터에 넣을 수 있습니다.
그러기 위해서는 콤마 연산자가 매우 편리합니다.이를 통해 식을 서로 연결하여 하나의 새로운 식을 형성할 수 있습니다.대부분의 경우 for 루프에서는 콤마 연산자의 다른 의미(값 할당 고려사항 등)는 작은 역할을 합니다.
비록 당신이 창조적인 구문을 사용함으로써 현명한 일을 할 수 있지만, 나는 그렇게 할 좋은 이유를 찾을 때까지 그것을 멀리할 것이다.루프용 코드 골프를 치면 코드를 읽고 이해(및 유지 관리)하기 어려워집니다.
위키피디아에도 좋은 글이 있어요.
에서는 모든 것이 옵션입니다.for
루프. 여러 변수를 초기화할 수 있고, 여러 조건을 확인할 수 있으며, 쉼표 연산자를 사용하여 여러 변수를 반복할 수 있습니다.
와 같다for
loop으로 합니다.상태를 확인하면서 주의하세요.
for(;;)
Konrad는 내가 반복하고 싶은 요점을 언급했다.맨 오른쪽 식 값은 식 전체의 값입니다.
Gnu 컴파일러는 for 루프의 "condition" 섹션에 두 가지 테스트를 넣었을 때 이 경고를 표시했습니다.
warning: left-hand operand of comma expression has no effect
제가 "조건"을 위해 의도한 것은 "&" 사이에 "&"가 있는 두 가지 테스트였습니다.Konrad의 진술에 따르면 쉼표 오른쪽에 있는 테스트만 조건에 영향을 미칩니다.
for 루프는 for의 특정 시간 동안 실행됩니다.
루프의 싱텍스
대상;)
또는
for(초기화자; 조건; 카운터)
예(rmv=1;rmv<=15;rmv++)
블록의 경우 15회까지 실행
1. 먼저 값을 초기화한다. 왜냐하면 값을 시작하기 때문이다.
(예) rmv=1 또는 rmv=2
2. 두 번째 스테이트먼트는 조건이 true 또는 false, 조건 true no. of time은 for 루프를 실행하고 조건 true는 block의 false terminate입니다.
예: i=5;i<=10 조건이 참입니다.
i=10;i<10 the condition is false terminate for block,
3. 세 번째는 증가 또는 감소입니다.
(예) rmv+ 또는 ++rmv
언급URL : https://stackoverflow.com/questions/276512/what-is-the-full-for-loop-syntax-in-c
'source' 카테고리의 다른 글
Function pointer를 사용하면 프로그램이 느려집니까? (0) | 2022.08.29 |
---|---|
VueJS 계산 데이터를 소품으로 전달하면 정의되지 않은 상태로 반환됨 (0) | 2022.08.29 |
VueJS2 v-html(필터 포함) (0) | 2022.08.29 |
vue 소품일 경우 필요합니까? (0) | 2022.08.28 |
수정 2.0: 역직렬화된 오류 응답을 얻는 방법.몸 (0) | 2022.08.28 |