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

Pat*_*lej 4 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;
}
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在变化.


Tim*_*nes 7

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

 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减少到39
  • 条件i < 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)

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