簡體   English   中英

為什么我的循環不會變得無限

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM