2015-12-04 2 views
-1

Может кто-нибудь объяснить разницу между этими двумя кодами для цикла?C - Разница между кодами for-loop

Код 1:

int j = 0; 
int i; 
int n = 8; 
for (i = 0; i < n; i++){ 
     printf("Value if I: %d\n",i); 
    while (j < n){ 
     printf("Value of J: %d\n",j); 
     j++; 
     } 
} 

} 

ВЫВОД:

i = 0 , j = 0,1,2,3,4,5,6,7 
i = 1 
i = 2 
i = 3 
i = 4 
i = 5 
i = 6 
i = 7 

Код 2:

int i; 
int n = 8; 
for (i = 0; i < n; i++){ 
     printf("Value if I: %d\n",i); 
     int j = 0; 
    while (j < n){ 
     printf("Value of J: %d\n",j); 
     j++; 
     } 
} 

} 

ВЫВОД:

i = 0 , j = 0,1,2,3,4,5,6,7 
    i = 1 , j = 0,1,2,3,4,5,6,7 
    i = 2 , j = 0,1,2,3,4,5,6,7 
    i = 3 , j = 0,1,2,3,4,5,6,7 
    i = 4 , j = 0,1,2,3,4,5,6,7 
    i = 5 , j = 0,1,2,3,4,5,6,7 
    i = 6 , j = 0,1,2,3,4,5,6,7 
    i = 7 , j = 0,1,2,3,4,5,6,7 

Почему существует вариант среди двух вышеперечисленных кодов для цикла?

+1

Просто подумайте, какой 'j' находится в каждом цикле в обоих примерах. – juanchopanza

ответ

3

Во втором коде вы сбрасываете j каждый раз перед циклом while, поэтому вы получаете все значения j для каждого цикла i. В первом случае вместо того, чтобы перейти к j = 8, сброса этого значения больше нет, поэтому каждый раз, когда условие while проверяется, оно возвращает FALSE, и оно больше не печатает его.

0

Во втором коде вы инициализируете j по 0 каждой итерации цикла for. Таким образом, ваш цикл while() запускает 8 раз каждый раз, когда цикл петли работает для второго кода.

Чтобы расширить на том, что здесь именно то, что происходит:

int i; // i declared 
int n = 8; // n declared & initialised 
for (i = 0; i < n; i++){ // runs 8 times, while i < 8, i starting at 0 
     printf("Value if I: %d\n",i); // print 
     int j = 0; // declares & intialises j 8 times (every iteration) 
    while (j < n){ // runs 8 times j < 8, j starting at 0, for every iteration of the for loop 
     printf("Value of J: %d\n",j); // print 
     j++; // increment j 
     } 
} 

} 
1

Ну основное отличие состоит в том, что J создается каждый раз, когда вы делаете новый цикл во втором коде, по сравнению с будучи локальной переменной в первом цикле.

Это означает, что после первого цикла в первом кодовом J всегда будет 8, а также не печатать больше (потому что уже 8 из первого контура)

int j = 0; 
int i; 
int n = 8; 
for (i = 0; i < n; i++){ 
     printf("Value if I: %d\n",i); 
    while (j < n){ 
     printf("Value of J: %d\n",j); 
     j++; 
     } 
    j = 0 //THIS RESETS J TO 0 SO IT WILL RUN 8 TIMES PER LOOP 
} 

} 

что-то вроде выше, будет работать так же, как второй блок кода

0

Поскольку во втором цикле вы устанавливаете значение j равным 0, поэтому, когда он запускается, он должен печатать все числа от 0 до 8. В вашем первом цикле вы устанавливаете значение j равным 0 раз поэтому во время выполнения команд и в следующем цикле пока не выполняется, поскольку значение j равно 8, вы не устанавливаете j = 0 в каждом цикле как второй.

Смежные вопросы