'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;
}
您还可以学习使用调试器单步执行代码,以在循环中查看 x
、y
和 z
中的值。我发现使用 printf()
语句很有用——我编写的代码通常适合这种调试。如果您开发 GUI 程序,它的帮助可能不大,或者需要在设置(打印信息的地方)时更加小心才能有所帮助。
我想看看我对这个简单程序的工作方式的理解是否正确。 它有效我只是想确保我明白为什么。
#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;
}
您还可以学习使用调试器单步执行代码,以在循环中查看 x
、y
和 z
中的值。我发现使用 printf()
语句很有用——我编写的代码通常适合这种调试。如果您开发 GUI 程序,它的帮助可能不大,或者需要在设置(打印信息的地方)时更加小心才能有所帮助。