[英]Why is my loop not going infinite
#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
的数字,循环不会变为无穷大。 让我们说用户输入40为n
; 难道i
不会总是n-1
,所以39和n
是40,那么当n
变为39时i
变成38,依此类推 - 那么这不会成为无限循环吗?
for(int i=n-1;i<n;n--)
让我们为n = 40
绘制一个(非常短的)表格:
i | n
-----+-----
39 | 40 i < n ? true
39 | 39 i < n ? false
因此,我们将在第一次迭代后退出循环。
澄清 :
我猜你很困惑,因为你认为i
在每次迭代中都会更新,但这就是重点 - 它没有 ,它的值是固定的,只有n
在变化。
此循环仅运行一次。 考虑:
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
会导致整数溢出 。 但是,在大多数系统上,该值可能会转换为INT_MIN
或-2,147,483,648。
i < n
将为false,并且您的循环将终止。 但是,由于有符号整数上的整数溢出是未定义的行为 ,因此您无法确定是否会发生这种情况。 编写程序最好避免这种情况。
如果你真的希望它永远运行 - 只需写:
while(1) { ... }
要么
for(;;) { ... }
这两个循环的优点是它们是编写无限循环的常用方法,因此它们很容易被其他程序员读取。
原因是i
永远不会减少,所以它只做一个循环:
i=39 n=40
i=39 n=39 -> stop
为了减少i
也应该写:
for(int i = n-1;i<n;n--,i--)
由于int是有符号的并且其值范围为-2147483648到2147483647(例如(x86)),因此n
将下溢。 有些人会比我更积极。
编辑:循环最多有1次迭代。
编辑2:如果n的值为-2147483648,则循环将没有迭代,因为-2147483648 - 1将使值为正(两个补码整数运算)。 但这种情况永远不会发生,因为前提条件是n可能不是负数。
我只在循环开始时设置过一次。 例如,如果用户输入10,则第一次迭代i为9。 到第二次迭代时,n减1,i仍然是9。
你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
永远不会改变值,因此循环在单次迭代后结束。
发生这种情况是因为你正在递减n
。 在第二次迭代中, i < n
为假,您正在退出循环。
会发生什么是:
//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)
你的条件在for循环中是错误的..在你的循环中我不改变只有n正在改变试试这个
for(i=n-1;i<n;i--)
{
printf("%d\n",i);
}
你写的完美的循环... for(int i = n-1; i
#include<stdio.h>
#include<conio.h>
int main()
{
int i;
for(i=0;;)
{
printf("%d",i);
}
return 0;
}
或者你可以做任何其他事情....无限制地简单地制作;; 在循环中的另外两个条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.