Маленькое сомнение в петлях - PullRequest
1 голос
/ 30 декабря 2010

Сколько раз значение 'x' будет проверено в следующем фрагменте кода?

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

Мне кажется, что ответ 11 , номой модуль говорит, что это 10 ?!что мне не хватает?

Ответы [ 12 ]

8 голосов
/ 30 декабря 2010

Одиннадцать, так как условие проверяется в начале каждой итерации цикла перед вызовом 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)
3 голосов
/ 30 декабря 2010

Ваш цикл запускается, только если x <10, поэтому x - это все значения от 0-9, а не 0-10. Есть 10 значений 0-9, поэтому ваш цикл выполняется 10 раз. </p>

Или, если вы просто говорите о сравнении, тогда да, это тест 11 раз. Ваш модуль неверен.

2 голосов
/ 31 декабря 2010

Если ваш вопрос о том, сколько раз выражение x < 10 вычисляется, ответ - это зависит.Это зависит от оптимизации компилятора.Если компилятор генерирует наивный код, он оценит его 11 раз.Если компилятор полностью развернет ваш цикл, ответ будет 0. Также возможно все промежуточное.

2 голосов
/ 30 декабря 2010

Если вам не нравятся отладчики, вы можете обмануть:

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

который печатает

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

Если вы хотите сделать все правильно и научиться отлаживать программное обеспечение, начните с чтения 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       }
1 голос
/ 02 января 2011

Эй, ребята, это намного проще!

Цикл for выглядит следующим образом:

loop

Это дает, что условие проверено:

  • до первой итерации,
  • после каждой итерации.

Следовательно, 10 взаимодействий дают 11 тестов. Простой!

1 голос
/ 30 декабря 2010
for(x=0;x < 10; x++) 

X начинается с нуля, но заканчивается на 9, потому что ваш код зацикливается, а x меньше 10, поэтому для исправления здесь есть несколько решений:

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

и

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

В обоих случаях получится 11

1 голос
/ 30 декабря 2010

Да. ТЕСТ будет выполнен 11 раз, тело - только 10 раз.

1 голос
/ 30 декабря 2010

В 0-9 есть десять значений, но это будет проверено 11 раз, последний раз вернет false, выходя из цикла.

0 голосов
/ 01 января 2011

Это головоломка, которую обычно задают в интервью. Простой способ проверить это изменить его с 10 на 1, то есть базовый случай:

для (x = 0; x <1; x ++) printf ("% d", x); </p>

Распечатывается 1 раз. Когда x = 1, он выходит из цикла и не включается в содержимое цикла for. Следовательно, он печатается «x» раз, а не «x + 1» раз.

Кроме того, вы также можете думать об этом как о: для (х = 1; х <2; х ++) </p>

Выполняет содержимое цикла, когда x = 1, но не x = 2 или (2 - 1) раза. Поэтому важно помнить, когда он фактически выходит из цикла и какие значения для x выполняются в содержимом цикла.

0 голосов
/ 30 декабря 2010

Ты серьезно?это должно быть интуитивно понятно!

x проверено n+1 раз (где n равно 10), , но условие выполняется n раз только потому, что вы используете оператор < *!

, чтобы увидеть эффект:

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

последний оператор печати должен вывести 10, что означает, что x проверяется еще раз (так как мы начинаем с нуля,x проверено 11 раз).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...