Путаница в отношении цикла for в логике c: приращения в языке c - PullRequest
0 голосов
/ 20 октября 2018

У меня путаница в базовой концепции языка Си для приращения цикла.Это мой код:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int j=0;int a;
    for(j;j<=3;++j)
    {
        printf("hello\n");
        a=j;
    }
    printf("%d,%d\n",j,a);
}

Мой вопрос таков: почему вывод не равен выводу j?Я думал, что если j увеличивается для каждой итерации и значение j сохраняется в a, то почему это не то же самое?

Ответы [ 5 ]

0 голосов
/ 20 октября 2018

1-й:

 j = 0 
 j <= 3 => print hello and a = 0, ++j

2-й:

 j = 1
 j <= 3 => print hello and a = 1, ++j

3-й:

 j = 2
 j <= 3 => print hello and a = 2, ++j

4-й:

 j = 3
 j <= 3 => print hello and a = 3, ++j

5-й:

 j = 4 not satisfy j <= 3

То есть j = 4 и a = 3

0 голосов
/ 20 октября 2018

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

Итак, для первой итерации, j равно 0, и, следовательно, условие выполняется, и a присваивается значение j.Теперь значение j увеличивается на 1. Это продолжается до j = 3.

Когда j = 3, a также равно 3. Теперь значение j увеличивается на 1, и оно равно 4. Теперь условие проверяется.Начиная с j!=3, цикл разрывается, и вы выходите из цикла.Следовательно, хотя j = 4, а по-прежнему равно 3.

Надеюсь, это поможет.

0 голосов
/ 20 октября 2018

Для j=0 a = 0

Для j=1 a = 1

Для j=2 a = 2

Для j=3 a = 3

Для j=4 цикл завершается, когда j<=3 становится ложным, поэтому значение j равно 4, а значение равно 3.

0 голосов
/ 20 октября 2018

Это связано с тем, как выполняются 3 выражения в цикле for.

Рассмотрим

for( exp1; exp2; exp3)
{
    body;
}

Это будет выполняться следующим образом:

exp1;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
body;
exp3;
if (exp2 == false) goto end_of_loop;
. . . 
. . .

end_of_loop:

Как видите, exp3 всегда выполняется один раз после body.

Таким образом, в вашем случае j будет увеличен один раз после того, как ему присвоено a.Нравится:

 a=j; // part of body
 ++j; // exp3
 j<=3 (exp2) becomes false and the loop ends
0 голосов
/ 20 октября 2018

До j<=3 условие j присваивается a, но после этого, когда j увеличивается на 1 (j == 4), оно вырывается из цикла как значение j теперь 4 и ему не присвоено значение j для a.Итак, наконец мы получаем a=4 и j=3.

...