문제
나는 아주 이상한 것을 보았다 for
다른 사람들의 코드를 읽을 때 루프. 나는 for
루프를 넣습니다 C
그러나 단어는 "매우 어렵다"for
"관련없는 문장으로 나타나서 검색을 Google에 효과적으로 거의 불가능하게합니다.
이 질문은 읽은 후에 내 마음에왔다 이 스레드 다시 호기심을 불러 일으켰습니다.
그만큼 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를 수행 한 다음 B를 수행 한 다음 X를 B의 값으로 설정합니다.
for syntax는 다음과 같습니다.
for (init; condition; increment)
...
어느 정도입니다 (무시합니다 continue
그리고 break
지금은)에 해당합니다 :
init;
while (condition) {
...
increment;
}
따라서 루프 예제입니다 (다시 무시합니다 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;
}
위의 기간 루프로 단순화 된 전환에 있지 않은 For 루프의 두 가지 추가 세부 사항 :
- 상태가 생략되면 항상입니다
true
(abreak
,goto
, 또는 다른 것이 루프를 끊습니다). - ㅏ
continue
마치 증가 직전에 레이블에 대한 goto 인 것처럼 행동합니다.continue
증가하는 루프에서는 증분을 건너 뛸 수 있습니다.
또한 쉼표 연산자에 대한 중요한 세부 사항 : 그것은 시퀀스 지점입니다. &&
그리고 ||
(이것이 별도의 진술로 나누고 그 의미를 그대로 유지할 수있는 이유입니다).
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 문
진술
for ( clause-1 ; expression-2 ; expression-3 ) statement
발현 발현 -2는 루프 본체의 각 실행 전에 평가되는 제어 표현입니다. 발현 발현 -3은 루프 본체의 각각의 실행 후 공극 발현으로서 평가된다. 1 항 -1이 선언 인 경우, 선언하는 변수의 범위는 다른 두 표현식을 포함하여 선언의 나머지 및 전체 루프입니다. 제어 표현의 첫 번째 평가 전에 실행 순서로 도달합니다. 조항 -1이 표현 인 경우, 제어 표현의 첫 번째 평가 전에 공극 표현으로 평가된다.133)
절 1 항과 표현 -3을 모두 생략 할 수 있습니다. 생략 된 발현 -2는 0이 아닌 상수로 대체됩니다.
133) 따라서, 1 항은 루프에 대한 초기화를 지정하여 루프에 사용하기 위해 하나 이상의 변수를 선언 할 수있다. 제어 발현, 발현 -2는 각각의 반복 전에 이루어진 평가를 지정하여, 표현식이 0과 동일 할 때까지 루프의 실행이 계속되도록; 표현식 -3은 각 반복 후에 수행되는 작업 (증분 등)을 지정합니다.
다른 팁
쉼표는 단순히 두 가지 표현을 분리하며 정상 표현이 허용되는 C의 어느 곳에서나 유효합니다. 이들은 왼쪽에서 오른쪽으로 순서대로 실행됩니다. 가장 오른쪽 표현의 값은 전체 표현식의 값입니다.
for
루프는 세 부분으로 구성되며 그 중 하나는 비어있을 수 있습니다. 하나 (첫 번째)는 처음에 실행되고, 하나는 각 반복 끝에 (세 번째)가 실행됩니다. 이 부분은 일반적으로 카운터를 각각 초기화하고 증가시킵니다. 그러나 그들은 무엇이든 할 수 있습니다.
두 번째 부분은 a입니다 테스트 이는 각 실행의 시작 부분에 실행됩니다. 테스트가 생성되는 경우 false
, 루프가 중단됩니다. 그게 전부입니다.
루프의 C 스타일은 세 가지 표현식으로 구성됩니다.
for (initializer; condition; counter) statement_or_statement_block;
- 루프가 시작될 때 이니셜 라이저가 한 번 실행됩니다.
- 조건은 각 반복 전에 점검됩니다. 루프는 TRUE로 평가하는 한 실행됩니다.
- 카운터는 각 반복 후 한 번 실행됩니다.
이러한 각 부분은 루프를 작성하는 언어로 유효한 표현식 일 수 있습니다. 즉,보다 창의적으로 사용할 수 있습니다. 미리하고 싶은 것은 이니셜 라이저로 들어갈 수 있습니다.이 사이에하고 싶은 모든 것은 루프에 더 이상 몸체가없는 지점까지 조건이나 카운터로 들어갈 수 있습니다.
이를 달성하기 위해 쉼표 운영자는 매우 편리합니다. 그것은 당신이 표현을 함께 체인하여 단일 새로운 표현을 형성 할 수있게합니다. 대부분의 시간은 For Loop에서 그러한 방식으로 사용되며, 쉼표 연산자 (예 : 가치 할당 고려 사항)의 다른 의미는 사소한 역할을합니다.
구문을 창의적으로 사용하여 영리한 일을 할 수는 있지만 진짜 그렇게해야 할 좋은 이유. For Loops와 함께 코드 골프를 플레이하면 코드가 읽고 이해하고 유지하기가 더 어려워집니다.
Wikipedia는 멋지다 for 루프에 관한 기사 또한.
모든 것이 선택 사항입니다 for
고리. 둘 이상의 변수를 초기화 할 수 있으며 둘 이상의 조건을 확인할 수 있으며 Comma 연산자를 사용하여 둘 이상의 변수를 반복 할 수 있습니다.
다음과 같은 for
루프는 당신을 무한 루프로 데려 갈 것입니다. 상태를 확인하여주의하십시오.
for(;;)
Konrad는 내가 반복하고 싶은 핵심 요점을 언급했습니다. 가장 오른쪽 표현의 값은 전체 표현식의 값입니다.
GNU 컴파일러는 For Loop의 "조건"섹션에 두 개의 테스트를했을 때이 경고를 언급했습니다.
warning: left-hand operand of comma expression has no effect
내가 "조건"을 위해 실제로 의도 한 것은 "&&"사이의 두 가지 테스트였습니다. Konrad의 진술에 따르면, 쉼표의 오른쪽에 대한 테스트만이 조건에 영향을 미칩니다.
for 루프는 (;;)의 특정 시간 동안 실행입니다.
루프를위한 syntex
을 위한(;;)
또는
for (이니셜 라이저; 조건; 카운터)
예 : (rmv = 1; rmv <= 15; rmv ++)
블록을 위해 15 회 실행
1. 값을 시작하기 때문에 값을 초기화합니다
(예 : RMV = 1 또는 RMV = 2
2. 세문 명령문은 조건이 true 또는 false이며, 조건의 true no. time exeence for loop 및 조건은 블록에 대해 잘못된 종료됩니다.
예 : i = 5; i <= 10 조건은 참입니다.
i=10;i<10 the condition is false terminate for block,
3. 세 번째는 증가 또는 감소입니다
(예 : RMV ++ 또는 ++ RMV