2010-12-30 3 views
1

'x'값이 일 때 다음 코드에서으로 테스트 된 횟수는 몇 번입니까? 나에게for-loops에서의 작은 의심

int x; 
for(x=0;x < 10; x++) 
    printf("%d",x); 

는 대답은 11 것 같다하지만 내 모듈은 10 말한다?! 나는 무엇을 놓치고 있습니까?

+0

디버거는 친구입니다 –

+0

@Ed Swangren : 저는 디버거를 사용하는 방법에 대해별로 몰라요. (필자는이 점에 관해 더 많은 도움을 주실 것입니다 :) – Quixotic

+1

"테스트 된"의미는 무엇입니까? "내 모듈이 10이라고 말합니다"는 의미는 무엇입니까? –

답변

8

일레븐은 printf와 호출 전에 :

0 < 10 == true 
1 < 10 == true 
2 < 10 == true 
3 < 10 == true 
4 < 10 == true 
5 < 10 == true 
6 < 10 == true 
7 < 10 == true 
8 < 10 == true 
9 < 10 == true 
10 < 10 == false // exit from loop (printf not executed) 
+0

+1, 제거했습니다.하지만 좋은 전략은 $ x <1 $ = 2와 $ x <2 $ = 3, $ x Quixotic

3

루프는 x < 10 일 때만 실행되므로 x는 0-10이 아닌 0-9의 모든 값입니다. 0-9 값이 10 개이므로 루프가 10 회 실행됩니다.

만약 당신이 단지 비교에 대해 이야기하고 있다면 그렇습니다. 시험은 11 번입니다. 모듈이 올바르지 않습니다. 조건이 각 루프 반복의을 시작하는 에서 시험 될 때

+0

예, 댓글을 추가 한 후 약 5 초가 지난 것을 보았습니다. : P – Will

+0

좋아요. -1 : – Quixotic

0

10 배 -

  1. 할당 0 X
  2. 에 x < 0이 참인지 확인하십시오. 6으로 이동하지 않을 경우
  3. 루프 몸체 실행
  4. 증가 X
  5. 이동 루프 조건이 거짓이되는 열한번째 시간 이후 당신이 그것을 통과하면

, 당신은 10 번 호출되는 루프 본문으로 끝낼 루프 후 2

  • 코드에 시체는 절대로 실행되지 않습니다.

  • +0

    -1입니다. 내 질문을 확인하십시오. 답을 편집하여 -1을 제거 할 수 있도록하십시오. – Quixotic

    +1

    제 답변이 다소 정확했습니다. 나는 '테스트 된'부분을 겹쳐 쓰고 '10 '은 틀릴 수도 있지만 응답이 유효하다. 사람들에게 당신이 방금 그들을 downvoted했다는 것을 말하기보다는 오히려 그것을 읽을 시간이 있다면 - 이것은 내 동기를 확실히 증가시킬 것이다. 미래에 당신에게 응답하십시오. –

    +1

    질문에 대한 요점은 for 루프가 어떻게 작동하는지 알지 못하는 것입니다. 내 대답은 그것을 설명합니다. –

    0

    예, x < 10 표현식은 11 번 평가됩니다. 처음 10 번은 사실이며 거짓 인 마지막 시간입니다 (x==10).

    1

    0-9에 10 개의 값이 있지만, 이 테스트되었습니다. 11 번, 마지막으로 false가 반환되어 루프를 종료합니다.

    1

    예. TEST은 11 회 실행되며, 본문은 10 회만 실행됩니다.

    1
    for(x=0;x < 10; x++) 
    

    X 제로에서 시작하지만, x는 10 이하 그래서 여기에이 문제를 해결하기 위해 몇 가지 솔루션입니다 동안 코드 루프 때문에 9에서 끝 :

    for(x=0;x <= 10; x++) 
    

    for(x=0;x < 11; x++) 
    

    이것들은 모두 11가됩니다.

    2

    디버거가 마음에 들지 않으면 속임수를 쓸 수 있습니다 :

    당신이 일을 올바른 방법을하고 그 과정에서 디버깅 소프트웨어를 배우고 싶은 경우에

    testing 0 
    0 
    testing 1 
    1 
    testing 2 
    2 
    testing 3 
    3 
    testing 4 
    4 
    testing 5 
    5 
    testing 6 
    6 
    testing 7 
    7 
    testing 8 
    8 
    testing 9 
    9 
    testing 10 
    

    를 인쇄

    int main() { 
        int x; 
        for(x=0;(printf("testing %d\n", x) || 1) && (x < 10); x++) 
         printf("%d\n",x); 
        return 0; 
    } 
    

    this을 읽고 시작합니다.

    다음은 위의 코드가있는 gdb 세션입니다. 루프 테스트 라인에 도달 한 횟수를 세어 볼 수 있습니다. 11시입니다.

    $ gdb loop 
    GNU gdb (GDB) 7.0.1-debian 
    Copyright (C) 2009 Free Software Foundation, Inc. 
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
    This is free software: you are free to change and redistribute it. 
    There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
    and "show warranty" for details. 
    This GDB was configured as "x86_64-linux-gnu". 
    For bug reporting instructions, please see: 
    <http://www.gnu.org/software/gdb/bugs/>... 
    Reading symbols from /home/nathan/c/loop...done. 
    (gdb) break 6 
    Breakpoint 1 at 0x4004ec: file loop.c, line 6. 
    (gdb) run 
    Starting program: /home/nathan/c/loop 
    
    Breakpoint 1, main() at loop.c:6 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) n 
    testing 0 
    7    printf("%d\n",x); 
    (gdb) 
    0 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 1 
    7    printf("%d\n",x); 
    (gdb) 
    1 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 2 
    7     printf("%d\n",x); 
    (gdb) 
    2 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 3 
    7    printf("%d\n",x); 
    (gdb) 
    3 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 4 
    7    printf("%d\n",x); 
    (gdb) 
    4 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 5 
    7    printf("%d\n",x); 
    (gdb) 
    5 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 6 
    7    printf("%d\n",x); 
    (gdb) 
    6 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 7 
    7    printf("%d\n",x); 
    (gdb) 
    7 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 8 
    7    printf("%d\n",x); 
    (gdb) 
    8 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 9 
    7    printf("%d\n",x); 
    (gdb) 
    9 
    6   for(x=0; (printf("testing %d\n", x) || 1) && (x < 10); x++) 
    (gdb) 
    testing 10 
    8   return 0; 
    (gdb) 
    9  } 
    
    +0

    +1 Lol! 정말 좋은,하지만 지금은 더 나은 수학 접근 방식으로 행복하게 :) – Quixotic

    0

    심각한가요? 이것은 직관적이어야합니다!

    x은 (n는 10) n+1 시간, 을 테스트 있지만 < 연산자 *을 사용하는 경우에만 있기 때문에 조건이 만족 n 번!

    int x; 
    for(x=0;x < 10; x++) 
        printf("%d",x); 
    printf("%d",x); 
    

    마지막 인쇄 문 x 한 번 더 시험을 나타냅니다 출력 10 (우리는 0에서 시작하기 때문에이 x 실제로 11 번 테스트)해야합니다

    는 효과를 볼 수 있습니다.

    +0

    마지막 인쇄 진술은 실제로 10 출력됩니다 : P – Muggen

    +0

    그래, 나는 <= 또는 그 밖의 이유 이외의 이유로 인해 알았어. 귀납적 인 논리는 그렇게 작동합니다 ... – Quixotic

    +0

    @ 뮤겐, 당신은 독수리 눈을 가지고! 내가 사소한 생각 이후 코드를 테스트하지 않았지만, 분명히, 나는 정정에 대한 감사, 실수했습니다 :) –

    2

    질문이 표현식 x < 10의 평가 횟수와 관련이 있다면 대답은 - 다릅니다. 그것은 컴파일러 최적화에 달려있다. 컴파일러가 순진한 코드를 생성하면 11 번 평가됩니다. 컴파일러가 루프를 완전히 풀면 대답은 0이됩니다. 중간에있는 것도 가능합니다.

    0

    이것은 인터뷰 질문에서 일반적으로 묻는 두뇌 티저입니다. 쉽게 확인할 수있는 방법은 10에서 1로 변경하는 것입니다. 즉, 기본 사례 :

    (x = 0; x < 1; x ++) printf ("% d", x);

    1 회 인쇄됩니다. x = 1 일 때, 이것은 루프에서 빠져 나와 for 루프의 내용에 포함되지 않습니다. 따라서 "x + 1"시간이 아니라 "x"번 인쇄됩니다.

    또한, 당신은이 일을 같이 그것에 대해 생각 할 수 있습니다에 대한 를 (X = 1; X < 2, X ++)

    그것은 루프 내용을 X = 1,하지만 X = 2를 수행합니다 (2 - 1) 회. 기억해야 할 중요한 점은 실제로 루프에서 빠져 나가고 x의 값이 루프 내용 내에서 실행되는 경우입니다.

    1

    안녕하세요, 여러분, 그게 훨씬 쉽습니다!첫번째 반복 전에

    • ,
    • 각 반복 후 :이 조건이 테스트되었는지 제공

      loop

      : 같이 루프

      보인다.

    따라서 10 개의 인터렉션이 11 개의 테스트를 제공합니다. 단순한!