#include <stdio.h>
#include <cs50.h>
int main(void)
{
int n;
printf("Please give me an integer greater than zero!\n");
n=GetInt();
if(n<0)
{
printf("You are giving me a bad value!\n");
return 1;
}
for(int i=n-1;i<n;n--)
printf("%d\n",n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么如果用户输入一个数字,循环不会无限n.让我们说用户输入40 n; 并不i总是n-1,所以39岁和n40岁,然后i变成38岁时n变成39岁等等 - 所以这不会成为一个无限循环吗?
Mar*_*oun 14
for(int i=n-1;i<n;n--)
让我们绘制一个(非常简短的)表n = 40:
i | n
-----+-----
39 | 40 i < n ? true
39 | 39 i < n ? false
Run Code Online (Sandbox Code Playgroud)
因此,我们将在第一次迭代后退出循环.
澄清:
我猜你很困惑,因为你认为i在每次迭代中都会更新,但这就是重点 - 它没有,它的值是固定的,只是n在变化.
此循环仅运行一次.考虑:
for(int i=n-1;i<n;n--)
Run Code Online (Sandbox Code Playgroud)
n == 40,在第一次循环,i = 39.i < n为true(39 < 40 == true),所以我们第一次进入循环.n减少到39i < n是false(39 < 39 == false),所以我们没有第二次通过循环.现在,如果我们n增加而不是减少会发生什么?这会永远运行吗?
for(int i=n-1;i<n;n++)
Run Code Online (Sandbox Code Playgroud)
答案是"也许,但可能不是":
n将达到可以存储在整数中的最大值INT_MAX(limits.h在我的系统中定义为2,147,483,647).INT_MAX导致整数溢出.但是,在大多数系统中,该值可能会回转到INT_MIN,或者是-2,147,483,648.
i < n将为false,并且您的循环将终止.但是,由于有符号整数上的整数溢出是未定义的行为,因此您无法确定是否会发生这种情况.编写程序最好避免这种情况.
如果你真的希望它永远运行 - 只需写:
while(1) { ... }
Run Code Online (Sandbox Code Playgroud)
要么
for(;;) { ... }
Run Code Online (Sandbox Code Playgroud)
这两个循环的优点是它们是编写无限循环的常用方法,因此它们很容易被其他程序员读取.