문제

나는 아주 이상한 것을 보았다 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 (a break, 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top