2017-02-05 6 views
5

for 루프에서 ++i을 사용하고 있습니다. 즉, 루프가 실행되기 전에 i1으로 증가합니다. 나는 여기서 무엇이 잘못 되었는가?왜 str1 [0]의 첫 번째 할당은 무엇입니까? 그것은 str1 [1]의 안된다?

#include <stdio.h> 
#include <string.h> 

int main() { 
    char str1[100], str2[100]; 
    int i; 
    scanf("%s", str1); 
    for (i = 0; str1[i] != '\0'; ++i) { 
     str2[i] = str1[i]; 
    } 
    str2[i] = '\0'; 
    printf("%s\n", str2); 
    return 0; 
} 
+1

; 이걸 어떻게 추측하니? – alk

+2

나는 왜이 질문에 downvote를 이해하지 못한다. 그것은 의미 있고 합당한 몇 가지 질문 중 하나이다. –

+0

참조 용 [C-Standard (초안) 관련 장] (http://port70.net/~nsz/c/c11/n1570.html#6.8.5.3) : "* for (절 -1; expression-3) statement [...] 식 -3은 루프 본문을 실행할 때마다 void 식으로 계산됩니다. * " – alk

답변

5

루프 구문 세 개의 문장으로 구성된다 : 여기

코드이다. 세 번째 단계 ("업데이트 단계")는 에서 루프 본문의 끝 부분 인에서 실행됩니다. 따라서 첫 번째 반복에서는 i가 0입니다.

표현

for(init_stmt; cond_expr; update_stmt) 
    body_stmt; 

은 다음과 거의 비슷 코드가 발생합니다 :

{ 
    init_stmt; 
    while(cond_expr) { 
    body_stmt; 
    update_stmt; 
    } 
} 
+0

inc_stmt 대신 update 문이라고 부를 수 있습니다. – Rishi

+0

@ 리시 - 그게 실제로 더 좋은 용어입니다. 고마워요. – StoryTeller

1

난 당신이 착각 두려워 다음 for 문의 증가 표현의 맥락에서, ++i, i++, i += 1i = i + 1은 모두 동일한 효과를 갖는다. 또한이 증분 표현식은 조건을 평가하기 전에 각 반복마다 후에 번 실행되지만 이 아닌 첫 번째 반복은이됩니다. 여기에 for 문 평가를위한 단계는 다음과 같습니다

  1. 가 초기화 표현 i = 0 평가는;
  2. 조건식을 평가합니다. 거짓이면 루프에서 종료하십시오. break 문이 평가
    • 경우 continue 문이 직접 4 단계로 분기를 평가하는 경우
    • 루프를 종료;
    • 루프의 몸을 평가
    • 그렇지 않으면 브랜치는 제
  3. 가 증가 ++i 표현식을 평가하는 단계;
  4. 분기 마지막 문이 제대로 str2[i] = '\0';를 사용 2.

단계. for 루프의 끝에있는 i 값은 인 길이 인 (str1)이라는 조건에서 실패한 첫 번째 루프입니다. null 종결자를 str2에 저장하려는 인덱스입니다. 코드가이 방법을 단순화하고 안전 할 수

참고 :

#include <stdio.h> 

int main(void) { 
    char str1[100], str2[100]; 

    if (scanf("%99s", str1) == 1) { 
     for (int i = 0; (str2[i] = str1[i]) != '\0'; i++) { 
      continue; 
     } 
     printf("%s\n", str2); 
    } 
    return 0; 
} 
1

귀하의 전제는 잘못된 것입니다. i은 루프가 시작되기 전에 1로 증가되지 않습니다.

for (initialization_statement; conditional_statement; update_statement) { 
    body_of_for_loop 
} 

for 루프가 초기화 문을 실행 한 후 조건문이 true 경우 검사입니다 작동하는 방법. 조건문이 true이면 for 루프 본문이 실행됩니다. for 루프의 본문이 실행되면 update 문이 실행 된 후 다시 조건문이 평가됩니다. 루프 구문

0

:

for (initialization; condition; increment or decrement) 
{ 
     //Code 
} 

1 단계 : 변수 (i = 0)를 초기화한다.

2 단계 : 점검 조건 (str1[i] != '\0')

3 단계 : 조건 진정한 경우, 루프 몸에 간다.

4 단계 : 루프의 본문을 성공적으로 실행 한 후 증가 또는 감소 연산 부분 (++i)으로 이동하십시오.

자세한 내용은 이미지를 참조하십시오. 아니오 "내가되는 루프 *이 시작하기 전에 1로 증가하는 것을 의미 ++ 사용 *"

img