'while loop' 内存在 C 编程中是如何工作的?

How 'while loop' memory works in C programming?

我想看看我对这个简单程序的工作方式的理解是否正确。 它有效我只是想确保我明白为什么。

    #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 而 returns 只有 1 的商。 所以内存现在包含 1.

循环从上一次迭代开始 "x"取内存1中的内容,"z"赋值: 以下操作的其余部分; 1 % 10 = 0.1 留下 z 包含 1.

这是第一个数字成为最后一个数字的地方。 所以内存现在包含 0.

"y" 获取内存中的内容 0 * 10 = 0 + 1,即 "z"。 所以内存现在包含 1.

"x" 取内存中的内容 1 / 10 = 0.1 除法运算符 returns 只有商。 所以内存现在包含 0.

现在"x" = 0 所以条件已经满足 程序中断了。

所以如果有人能告诉我我是对的还是 向我解释哪里出了问题并帮助我 正确地看到这些概念,我真的会 感谢他们的见解。

谢谢。

你的逻辑不对(相当不对)。部分'...留下商所以内存现在包含 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;
}

您还可以学习使用调试器单步执行代码,以在循环中查看 xyz 中的值。我发现使用 printf() 语句很有用——我编写的代码通常适合这种调试。如果您开发 GUI 程序,它的帮助可能不大,或者需要在设置(打印信息的地方)时更加小心才能有所帮助。