2012-09-11 3 views
-1

Im 학습 C와 책을 읽는에서 아래에 나열된 첫 번째 루프를 보았다. 두 번째 차이점을 사용하는 데 익숙해 져서 다른 결과를 반환하더라도 차이점을 파악할 수 있으므로 두 사람의 차이점은 무엇인가 궁금합니다. 9이 두 FOR 루프의 차이점은 무엇입니까?

for(i = 0; i < 10; ++i){} 

for(i = 0; i <= 10; i++){} 
+1

[for '루프의 후치 증가 및 사전 증가] 가능한 복제본 (http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) – Joe

+0

루프가 어떻게 움직이는 지에 대한 변화는 없습니다. 변화는 '전후 증가'에 대해'내가'증가하는 방식입니다. – tez

답변

6

첫번째 반복하여 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 년 전부터 컴파일러에서 유효했지만 더 이상은 아닙니다.

+0

"int y = i ++;'"- 나는 더 느립니다. 'int y = ++ i;'보다 느리다는 것을 확신 할 수 있다고 생각합니다. 나는 그것이 어떤 연산 코드가 증가를 할 수 있느냐에 달려 있다고 생각하지만 기본적으로이 두 문장은 모두 'i'를 증가시키고 그 값을 증가 전이나 후에 'y'에 복사합니다. 증가 이전에 복사하는 것이 복사하는 것보다 더 비싸다고 생각하는 일반적인 이유가 있습니까? –

+0

@SteveJessop 맞습니다. 그럼에도 불구하고, 실제로는 후행 증가가 느리지 만이 경우에는 관련이없는 경우가 있습니다. –

+0

Btw, 둘 중 하나가 작동하면 비 성능 관련 이유로'++ i'를 선호합니다. 따라서 성능에 대한 주장에 관심을 가져야합니다. 일부 성능 문제가 내 스타일 환경 설정을 손상시켜야하는 경우가 있습니다 .-) –

0

첫 번째는 10 번 실행됩니다. 두 번째 것은 11 번 실행됩니다.

1

처음에는 이전 증분이 있고 두 번째 증분에는 증분이 있습니다.

는 유일한 것은 먼저 9 개까지 두 번째에 체크되어있는 상태, 즉 자사의 최대 개까지 10 증가 연산자는이 경우에는 차이가 없습니다 두 루프에서

+0

나는 같은 이유로 프로그래머가 ++ i를 선호한다고 보았습니다 – Cdeez

+0

터보 C로 일하는 70 세의 프로그래머입니까? –

+0

참고 문헌 : 답변자 [this] (http://stackoverflow.com/questions/4706199/post-increment-and-pre-increment-in-for-loop) 및 답변자가 게시 한 의견 (6 개의 upvotes가 있음 너무). 그래서 나는 생각하는 사람들이 있다고 생각합니다. – Cdeez

1

사전/사후 증가 작업은 값을 확정하는 동안 사 용할 때 작동합니다.

여기 i의 값이 11이 될하지만, j의 값은 값이 증가

j 즉 포스트에
i=10; 

j = ++i; 
다음

값이 할당 된 후 증가합니다 (10) i 때문에 될 것

i=10; 

j = i++; 

을 말 i의 값이 11이되고 j의 값이에 할당되기 전에 i이 증가하기 때문에 j의 값도 11이됩니다. e 사전 증가

0

대부분의 사람들은 이미 반복 횟수가 하나씩 다르며 사전 및 사후 증가가 여기에 영향을주지 않는다고 말했습니다.

C의 경우 첫 번째 루프가 더 일반적으로 발생하는 것입니다. 그 이유는 그 이유는 C는 제로 기반의 배열을 사용하고, 따라서 배열의 최대 값 (또는 문자열, 그 문자의 배열로) 배열의 인덱스로 사용되지 않는 것 같아요). 따라서이 예에서 길이가 10 인 배열을 반복 할 때 배열의 인덱스로 i을 안전하게 사용할 수 있기 때문에 첫 번째 루프가 더 논리적 인 루프가됩니다. 두 번째 루프에서는 오류가 발생합니다 (세그먼트 오류).

당신은 두 번째 것에 익숙하다고 말합니다.나는 당신이 그렇게 익숙하지 않은 이유를 모르지만, 다른 프로그래밍 언어 나 수학에서 루프 (합계와 같은)가 제한에 포함되어 실행된다는 사실을 가정합니다 (그러나 자주 시작합니다). 이러한 경우에는 0 기반 색인이 약간 실망 스러울 수 있습니다. 간단히 말해서, 제 경험으로 보았을 때 첫 번째 루프를 더 자주 찾을 수 있지만 두 번째 루프에는 많은 유스 케이스가 있습니다.

i++에 대해서는 ++i과 같습니다. for 문의이 부분은 루프의 끝에서 발생하기 때문에 후자에 대한 경향이 있습니다. 따라서 접미사 표기법이 더 논리적으로 느껴집니다. 그러나 다시 한번, 그것은 정말로 중요하지 않습니다.

관련 문제