4
#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;
}

我想知道为什么如果用户输入一个数字 for 循环不会无穷大n。假设用户输入 40 n; 不会i总是n-1,所以 39 和n40,然后i变成 38 当n变成 39 等等 - 那不会造成无限循环吗?

4

10 回答 10

14

for(int i=n-1;i<n;n--)

让我们为 绘制一个(非常短的)表格n = 40

  i  |  n
-----+-----
 39  | 40    i < n ? true
 39  | 39    i < n ? false

因此,我们将在第一次迭代后退出循环。

澄清

我猜你很困惑,因为你认为它i在每次迭代中都会更新,但这就是重点——它没有,它的值是固定的,只是n在变化。

于 2013-07-17T06:44:16.873 回答
7

这个循环只运行一次。考虑:

 for(int i=n-1;i<n;n--)
  • ,在n == 40第一次迭代中,i = 39
  • 条件i < n为真(39 < 40 == true),所以我们第一次进入循环。
  • 在第一个循环结束时,n递减到 39
  • 条件i < n为假 ( 39 < 39 == false),因此我们不会第二次通过循环。

现在,如果我们n增加而不是减少会发生什么?那会永远运行吗?

  for(int i=n-1;i<n;n++)

答案是“可能,但可能不是”:

  • 最终,n将达到可以存储在整数中的最大值INT_MAX(定义在 中limits.h,在我的系统上是 2,147,483,647)。
  • 使整数大于INT_MAX导致整数溢出
  • 有符号整数上的整数溢出的结果是undefined,这意味着结果可以是任何东西(实际上,您的程序可能会崩溃)。

然而,在大多数系统上,该值可能会环绕为INT_MIN或 -2,147,483,648。

  • 如果发生这种情况,i < n将是错误的,并且您的循环将终止。

但是,由于有符号整数上的整数溢出是未定义的行为,因此您无法确定是否会发生这种情况。最好编写程序来避免这种情况。


如果您真的希望它永远运行 - 只需编写:

while(1) { ... }

或者

for(;;) { ... }

这两个循环的优点是它们是编写无限循环的常用方法,因此它们易于其他程序员阅读。

于 2013-07-17T06:45:04.557 回答
3

原因是它i永远不会递减,所以它只执行 1 次循环:

 i=39 n=40
 i=39 n=39  -> stop

为了减少i你也应该写:

 for(int i = n-1;i<n;n--,i--)
于 2013-07-17T06:43:26.020 回答
2

i 只在循环开始时设置一次。例如,如果用户输入 10,那么在第一次迭代中 i 为 9。在第 2 次迭代中,n 减 1,i 仍为 9。

于 2013-07-17T06:42:14.343 回答
2

你的for循环:

for(int i=n-1;i<n;n--) {
    printf("%d\n",n);
}

转换为以下while循环:

{
    int i = n - 1;
    while (i < n) {
        printf(%d\n", n);
        n--;
    }
}

for语句的第一个子句执行初始化。它不会在每次迭代中重复,而只会重复一次。因此,i从不改变值,因此循环在单次迭代后结束。

于 2013-07-17T23:54:09.787 回答
2

n有时会下溢,因为 int 已签名并且值范围为 -2147483648 到 2147483647,例如(x86)。有时 n 会比 i 更积极。

编辑: 循环最多有 1 次迭代。

编辑 2: 如果 n 的值为 -2147483648 ,则循环将没有迭代,例如,因为 -2147483648 - 1 将使值变为正数(两个补码整数算术)。但这种情况永远不会发生,因为前提条件是 n 可能不是负数。

于 2013-07-17T06:41:31.173 回答
1

发生这种情况是因为您正在递减n. 在第二次迭代i < n为假时,您正在退出循环。

于 2013-07-17T06:42:29.083 回答
1

将会发生的是:

//Example n = 100
for (int i = 100 - 1; 99 < 100; 100--)
//We now have 99 < 99 on the next loop
//After that you will have 99 < 98 etc.. it will only run once

要制作您想要使用的循环:

for(int i = n-1; i > n ; n--)

要进行无限循环,请使用:

for(;;) //or while(true)
于 2013-07-17T06:44:28.280 回答
1

你写了完美的循环... for(int i=n-1;i

#include<stdio.h>
#include<conio.h>
int main()
{
    int i;
    for(i=0;;)
    {
        printf("%d",i);
    }
    return 0;
}

或者你可以做任何其他事情......简单地放入无限 make ;; 在循环中的其他两个条件中。

于 2013-07-17T13:04:27.283 回答
1

你的条件在 for 循环中是错误的..在你的循环中我没有改变只有 n 正在改变试试这个

   for(i=n-1;i<n;i--)
   {
   printf("%d\n",i);
   }
于 2013-07-17T06:54:42.803 回答