为什么我的循环不会变得无限

时间:2013-07-17 06:38:47

标签: c cs50

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

我想知道为什么如果用户输入n的数字,循环不会无限。让我们说用户为n输入40;不会i总是n-1,因此39和n为40,in变为39时变为38,依此类推 - 所以不会'是一个无限循环?

10 个答案:

答案 0 :(得分:14)

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

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

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

因此,我们将在1 st 迭代之后退出循环。

<强>澄清

我猜你很困惑,因为你认为i在每次迭代中都会更新,但那就是重点 - ,它的值是固定的,只有{{1正在改变。

答案 1 :(得分:7)

此循环仅运行一次。考虑:

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

现在,如果我们n增加而不是减少会怎样?这会永远运行吗?

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

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

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

但是,在大多数系统上,该值可能会回绕到INT_MIN或-2,147,483,648。

  • 如果发生这种情况,i < n将为false,您的循环将终止。

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


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

while(1) { ... }

for(;;) { ... }

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

答案 2 :(得分:3)

原因是i永远不会减少,所以它只有1个循环:

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

为了减少i,你应该写:

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

答案 3 :(得分:2)

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

修改 循环最多只有1次迭代。

编辑2: 如果n的值为-2147483648,则循环将没有迭代,因为-2147483648 - 1将使值为正(两个补码整数算术)。但事实并非如此,因为前提条件是n可能不是负数。

答案 4 :(得分:2)

我只在循环开始时设置过一次。例如,如果用户输入10,则第一次迭代i为9。到第二次迭代时,n减1,i仍然是9。

答案 5 :(得分: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永远不会改变值,因此循环在单次迭代后结束。

答案 6 :(得分:1)

这是因为您正在递减n。在第二次迭代i < n为假,您将退出循环。

答案 7 :(得分: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)

答案 8 :(得分:1)

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

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

答案 9 :(得分: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;
}

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