Для путаницы цикла в программе c - PullRequest
0 голосов
/ 30 января 2019

Почему цикл работает от 2 до 7?

int i;    
for(i=1;i<=6;printf("\n%d\n",i))    
i++;

Выходное значение равно

2
3
4
5
6
7

, но предел i равен 6.

Ответы [ 5 ]

0 голосов
/ 30 января 2019

Вы записали цикл for необычным образом.

Ниже описана операция цикла for.

  1. Сначала выполняется инициализация.i=1

  2. Затем проверяется выражение i<=6

  3. Затем выполняется тело i++

  4. Затем выполняется приращение.В вашем случае это printf("\n%d\n",i)

  5. Повторите шаги 2-4, пока шаг 2 не станет ЛОЖНЫМ.

В вашем случае вы можетеобратите внимание, что сначала будет printf для i==7, а затем будет проверено выражение для i==7.После этого цикл for завершится.Точно так же первая печать будет сделана только после одного приращения i

Итак, первая печать будет для 2, а последняя будет для 7

0 голосов
/ 30 января 2019

Работа цикла эквивалентна теперь очевидному

int i;    
for (i = 1; i <= 6; /*intentionally blank*/){
    i++;
    printf("\n%d\n", i);
}

, поскольку концептуально 3-е выражение в цикле for выполняется непосредственно перед закрывающей скобкой тела цикла.

0 голосов
/ 30 января 2019

Вы написали цикл неправильно - вы поменяли тело цикла на код приращения.Поэтому после выполнения i++, который находится в теле цикла, он выполняет printf в качестве приращения, когда это должно быть наоборот.

Правильно запишите цикл for следующим образом.

int i;    
for(i=1;i<=6;i++)
    printf("\n%d\n",i)    
0 голосов
/ 30 января 2019

A for петля типа

for(i=1;i<=6;printf("\n%d\n",i))    
    i++;

эквивалентна

{
    i = 1;  // Initialization clause from for loop

    while (i <= 6)    // Condition clause from for loop
    {
        i++;  // Body of for loop

        printf("\n%d\n", i);  // "Increment" clause from for loop
    }

}

Как видите, printf выполняется после переменнойi увеличивается, что, конечно, означает, что он напечатает увеличенное значение (2 до 7).

0 голосов
/ 30 января 2019

Синтаксис цикла for:

for ( предложение-1 ; выражение-2 ; выражение-3 ) оператор

Выполнение такое, как указано ниже, цитата из C11, глава §6.8.5.3, ( выделение мое)

Выражение expression-2 является управляющим выражением, которое оценивается перед каждым выполнением тела цикла .Выражение expression-3 оценивается как пустое выражение после каждого выполнения тела цикла. [....]

Здесь i++ - это тело, а printf("\n%d\n",i) - это выражение-3 .

Итак, порядок выполнения будет примерно таким:

 i = 1;
 start loop

    i < = 6          //==> TRUE
    i++;            //i == 2
    printf         // Will print 2    ///iteration 1  done

    i < = 6         //==> TRUE
    i++;           //i == 3
    printf        // Will print 3   ///iteration 2  done
    .
    .
    .
    i < = 6         //==> TRUE
    i++;           //i == 6
    printf        // Will print 6   ///iteration 5  done

    i < = 6         //==> TRUE
    i++;           //i == 7
    printf        // Will print 7   ///iteration 6  done

    i < = 6 ==> FALSE

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