Im 학습 C와 책을 읽는에서 아래에 나열된 첫 번째 루프를 보았다. 두 번째 차이점을 사용하는 데 익숙해 져서 다른 결과를 반환하더라도 차이점을 파악할 수 있으므로 두 사람의 차이점은 무엇인가 궁금합니다. 9
에이 두 FOR 루프의 차이점은 무엇입니까?
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
Im 학습 C와 책을 읽는에서 아래에 나열된 첫 번째 루프를 보았다. 두 번째 차이점을 사용하는 데 익숙해 져서 다른 결과를 반환하더라도 차이점을 파악할 수 있으므로 두 사람의 차이점은 무엇인가 궁금합니다. 9
에이 두 FOR 루프의 차이점은 무엇입니까?
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
첫번째 반복하여 10
두 번째 반복. 그게 다야.
사전/사후 증가 작업은 차이가 없습니다.
두 버전에 대해 생성 코드 최적화되지 않은 :
for(int i = 0; i < 10; ++i)
00E517AE mov dword ptr [i],0
00E517B5 jmp wmain+30h (0E517C0h)
00E517B7 mov eax,dword ptr [i]
00E517BA add eax,1
00E517BD mov dword ptr [i],eax
00E517C0 cmp dword ptr [i],0Ah
00E517C4 jge wmain+53h (0E517E3h)
{
}
for(int i = 0; i <= 10; i++)
00E517E3 mov dword ptr [i],0
00E517EA jmp wmain+65h (0E517F5h)
00E517EC mov eax,dword ptr [i]
00E517EF add eax,1
00E517F2 mov dword ptr [i],eax
00E517F5 cmp dword ptr [i],0Ah
00E517F9 jg wmain+88h (0E51818h)
{
}
그래서, 심지어 여기, 성능 저하가 없다합니다. i++
이 ++i
보다 느리다는 사실은 사실이 아닙니다 (적어도이 상황에서는 차이가 나지 않습니다). 예를 들어 int y = i++
의 경우 속도가 느려지 겠지만,이 경우에는 두 가지가 서로 다른 작업을 수행합니다. 여기서는 그렇지 않습니다. 성능 문제는 20 년 전부터 컴파일러에서 유효했지만 더 이상은 아닙니다.
"int y = i ++;'"- 나는 더 느립니다. 'int y = ++ i;'보다 느리다는 것을 확신 할 수 있다고 생각합니다. 나는 그것이 어떤 연산 코드가 증가를 할 수 있느냐에 달려 있다고 생각하지만 기본적으로이 두 문장은 모두 'i'를 증가시키고 그 값을 증가 전이나 후에 'y'에 복사합니다. 증가 이전에 복사하는 것이 복사하는 것보다 더 비싸다고 생각하는 일반적인 이유가 있습니까? –
@SteveJessop 맞습니다. 그럼에도 불구하고, 실제로는 후행 증가가 느리지 만이 경우에는 관련이없는 경우가 있습니다. –
Btw, 둘 중 하나가 작동하면 비 성능 관련 이유로'++ i'를 선호합니다. 따라서 성능에 대한 주장에 관심을 가져야합니다. 일부 성능 문제가 내 스타일 환경 설정을 손상시켜야하는 경우가 있습니다 .-) –
첫 번째는 10 번 실행됩니다. 두 번째 것은 11 번 실행됩니다.
처음에는 이전 증분이 있고 두 번째 증분에는 증분이 있습니다.
는 유일한 것은 먼저 9 개까지 두 번째에 체크되어있는 상태, 즉 자사의 최대 개까지 10 증가 연산자는이 경우에는 차이가 없습니다 두 루프에서
사전/사후 증가 작업은 값을 확정하는 동안 사 용할 때 작동합니다.
여기 i
의 값이 11이 될하지만, j
의 값은 값이 증가
j
즉 포스트에
i=10;
j = ++i;
다음
값이 할당 된 후 증가합니다 (10) i
때문에 될 것
i=10;
j = i++;
을 말 i
의 값이 11이되고 j
의 값이에 할당되기 전에 i
이 증가하기 때문에 j
의 값도 11이됩니다. e 사전 증가
대부분의 사람들은 이미 반복 횟수가 하나씩 다르며 사전 및 사후 증가가 여기에 영향을주지 않는다고 말했습니다.
C의 경우 첫 번째 루프가 더 일반적으로 발생하는 것입니다. 그 이유는 그 이유는 C는 제로 기반의 배열을 사용하고, 따라서 배열의 최대 값 (또는 문자열, 그 문자의 배열로) 배열의 인덱스로 사용되지 않는 것 같아요). 따라서이 예에서 길이가 10 인 배열을 반복 할 때 배열의 인덱스로 i
을 안전하게 사용할 수 있기 때문에 첫 번째 루프가 더 논리적 인 루프가됩니다. 두 번째 루프에서는 오류가 발생합니다 (세그먼트 오류).
당신은 두 번째 것에 익숙하다고 말합니다.나는 당신이 그렇게 익숙하지 않은 이유를 모르지만, 다른 프로그래밍 언어 나 수학에서 루프 (합계와 같은)가 제한에 포함되어 실행된다는 사실을 가정합니다 (그러나 자주 시작합니다). 이러한 경우에는 0 기반 색인이 약간 실망 스러울 수 있습니다. 간단히 말해서, 제 경험으로 보았을 때 첫 번째 루프를 더 자주 찾을 수 있지만 두 번째 루프에는 많은 유스 케이스가 있습니다.
i++
에 대해서는 ++i
과 같습니다. for 문의이 부분은 루프의 끝에서 발생하기 때문에 후자에 대한 경향이 있습니다. 따라서 접미사 표기법이 더 논리적으로 느껴집니다. 그러나 다시 한번, 그것은 정말로 중요하지 않습니다.
[for '루프의 후치 증가 및 사전 증가] 가능한 복제본 (http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) – Joe
루프가 어떻게 움직이는 지에 대한 변화는 없습니다. 변화는 '전후 증가'에 대해'내가'증가하는 방식입니다. – tez