Как работает память while в программировании на C? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь выяснить, правильно ли я понимаю, как работает эта простая программа.Это работает, я просто хочу убедиться, что я понимаю, почему.

    #include <stdio.h>

    int main(){
        int x, y = 0, z;
        x = 123;

        while(x != 0){
            z = x % 10;
            y = y * 10 + z;
            x /= 10;
        }

        printf(">>> %d", y);
        return 0;
    }

    output
    >>> 321

Я думаю, что это так.

Так что "x" был первоначально объявлен со значением 123, принимаетсяцикл вместе с условием, что состояние при x не равно 0, программа продолжается.

Цикл начинается и из исходного объявления «x» берет то, что находится в памяти 123, а «z» присваивается значение: остатокиз следующих операций;123% 10 = 12,3, оставляя "z", содержащее 3

. Таким образом, последнее число становится первым числом, которое теперь содержит память 12.

"y" берет то, что находится в памяти 12, и умножаетсяк 10 в сумме 120 добавляется к «z», что равно 3, поэтому память теперь содержит 123.

Тогда «x» занимает то, что находится в памяти 123/10
, в сумме 12,3 = 12. Таким образом, память теперь содержит 12

Цикл начинается с предыдущей итерации «x» принимает то, что находится в памяти 12, а «z» присваивается значение: остаток после операций;12% 10 = 2.

Здесь число от второго до последнего становится вторым числом.Таким образом, память теперь содержит 1.

Тогда «y» берет то, что находится в памяти 1 * 10 = 10 2, что является «z», поэтому память теперь содержит 12.

Тогда «x» берет то, чтонаходится в памяти 12/10 = 1,2 и возвращает только частное 1. Таким образом, память теперь содержит 1.

Цикл начинается с предыдущей итерации «x» принимает то, что находится в памяти 1, а «z» присваивается значение:остаток от следующих операций;1% 10 = 0,1, оставляя z, содержащий 1.

Именно здесь первое число становится последним числом.Таким образом, память теперь содержит 0.

"y" берет то, что находится в памяти, 0 * 10 = 0 + 1, что является "z".таким образом, память теперь содержит 1.

«x» берет то, что находится в памяти, 1/10 = оператор деления 0.1 возвращает только частное.Таким образом, память теперь содержит 0.

Теперь "x" = 0, так как условие выполнено, и программа прерывается.

Так что если кто-нибудь скажет мне, прав ли я, или объяснит мне, где я ошибся, и поможет мне правильно понять концепции, я был бы очень признателен за их понимание.

Спасибо.

1 Ответ

0 голосов
/ 05 февраля 2019

Ваша логика выключена (довольно плохо выключена).Раздел «… оставляя позади частное, чтобы память теперь содержала 12. Тогда y берет то, что находится в памяти 12…», особенно странно.Деление выполняется с использованием целочисленной арифметики, а не с плавающей запятой.Есть небольшая вероятность, что где-то есть регистр, содержащий 12, но он не умножается на 10 или что-либо еще, и наличие или отсутствие 12 не имеет значения для остальной части кода (если компилятору не удастся его использоватьвместо выполнения второго деления для x /= 10).

Более точная версия логики

Фактическая логика больше похожа на:

  • x == 123 означает x != 0, поэтому код проходит черезцикл:

    • z = 123 % 10 означает z == 3.
    • y = 0 * 10 + 3 означает y == 3.
    • x /= 10 означает x == 12.
  • x == 12 означает x != 0, поэтому код проходит через цикл:

    • z = 12 % 10 означает z == 2.
    • y = 3 * 10 + 2 означает y == 32.
    • x /= 10 означает x == 1.
  • x == 1 означает x != 0, поэтому код проходит черезцикл:

    • z = 1 % 10 означает z == 1.
    • y = 32 * 10 + 1 означает y == 321.
    • x /= 10 означает x == 0
  • x == 0 означает, что цикл завершается:

    • значение y равно 321.

Использование операторов печати, чтобы увидеть, как работает код

Обратите внимание, что вы могли бы позаботиться о себе, добавив в код подходящую печать.Например:

#include <stdio.h>

int main(){
    int x, y = 0, z;
    x = 123;

    printf("x = %d\n", x);
    while(x != 0){
        z = x % 10;
        printf("z = %d\n", z);
        y = y * 10 + z;
        printf("y = %d\n", y);
        x /= 10;
        printf("x = %d\n", x);
    }
    printf(">>> %d\n", y);
    return 0;
}

Вы также можете научиться шагать по коду с помощью отладчика, чтобы видеть значения в x, y и z по мере прохождения цикла.Я считаю полезным использование операторов printf() - кодирование, которое я делаю, обычно поддается такой отладке.Если вы разрабатываете программы с графическим интерфейсом, это, вероятно, менее полезно или требует большей осторожности при настройке (где печатается информация), чтобы быть полезным.

...