[英]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.