Цикл For по-прежнему увеличивается после выполнения условия false - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в C, так что этот вопрос, скорее всего, имеет простое решение, но я его не вижу.Я заметил, что мои результаты не соответствуют ожиданиям, и после нескольких часов отладки я понял, что один из циклов for работает не так, как ожидалось.Вот соответствующая часть моего кода:

for (i = 0; i < bytes; i++)
        {
            if ((temp_array[i]) == 0xCADE | (temp_array[i]) == 0xDADA)
            {

                printf("i is %d\n",i );
                i += 2;

                printf("i is now %d\n",i );

                n_body = temp_array[i];

                i++;

                printf("n_body is %d\n",n_body );

                for (count = 0, j = flag_index; count < n_body; i++, j++, count++)
                {

                    machine->memory[j] = temp_array[i];
                    printf("LETS SEE, i in loop is %d\n",i );
                    printf("LETS SEE, j in loop is %d\n",j );
                    printf("LETS SEE, count in loop is %d\n", count);

                }

                printf("\n");
                printf("LETS SEE, i out of loop is %d\n",i );
                printf("LETS SEE, j out of loop is %d\n",j );
                printf("LETS SEE, count out of loop is %d\n", count);

                machine->memory[j+1] = flag;

                //printf("flag is %d\n",flag );
                printf("machine memory index 18 is %d \n", machine->memory[18]);

            }

            // else
            // {
            //  continue;
            // }

            //printf("index is %d\n",i );
        }

Виновным является второй (вложенный) цикл for.Я заметил, что переменные i, j и count увеличиваются, если условие выполнения count < n_body больше не соответствует истине.В данный момент n_body равно 18, i равно 3, bytes равно 64 и flag_index равно 0. Я опубликовал результаты последних нескольких итераций цикла for и выходные данные из печати.операторы вне цикла for:

LETS SEE, i in loop is 18
LETS SEE, j in loop is 15
LETS SEE, count in loop is 15
LETS SEE, i in loop is 19
LETS SEE, j in loop is 16
LETS SEE, count in loop is 16
LETS SEE, i in loop is 20
LETS SEE, j in loop is 17
LETS SEE, count in loop is 17

LETS SEE, i out of loop is 21
LETS SEE, j out of loop is 18
LETS SEE, count out of loop is 18

Почему они увеличиваются?Я думал, что цикл for завершает работу (как при выполнении тела, так и перед пост-постом), когда условие выполнения больше не выполняется?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Это нормально.Вы можете увидеть небольшую демонстрационную программу.

#include <stdio.h>

int main() {
    int i = 0;
    for( i = 0; i < 3; i++ ) {
        printf("i in loop: %d\n", i);
    }

    printf("i after loop: %d\n", i);
}

$ ./test
i in loop: 0
i in loop: 1
i in loop: 2
i after loop: 3

Соответствующая часть стандарта следующая:

6.8.5.3 for оператор

1 Оператор

for ( clause-1 ; expression-2 ; expression-3 ) statement

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

Каждый раз, когда выполняется тело, происходит приращение.Если тело запускается три раза, это три итерации i++.

. Вы также можете думать о цикле for, подобном этому.

// for( int i = 0; i < 3; i++ ) {
int i = 0;
while( i < 3 ) {
    printf("i in loop: %d\n", i);
    i++;
}

Таким образом, ваш внутренний цикл эквивалентен ..

// for (count = 0, j = flag_index; count < n_body; i++, j++, count++) {
count = 0, j = flag_index;
while( count < n_body ) {                
    machine->memory[j] = temp_array[i];
    i++, j++, count++;
}
0 голосов
/ 22 мая 2018

Обновляет все переменные, а затем проверяет условия.Если условия верны, то снова.Если false, то выходит.Поэтому, если у вас есть for(x = 0; x < 5; ++x);, значение x будет равно 5, если вы напечатаете его вне цикла (x должно быть 5, чтобы x <5 было ложным). </p>

Вы можете найти блок-схемы циклов for онлайн, еслиты ищешь.Вот один из geeksforgeeks:

enter image description here

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