#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,i
在n
变为39时变为38,依此类推 - 所以不会'是一个无限循环?
答案 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。 但是,在大多数系统上,该值可能会回绕到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;
}
或者你可以做任何其他事情.... 放入无限简单的制作;;在循环中的另外两个条件。