4
#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ので、39nで 40 になり、39iになると 38 にnなります。

4

10 に答える 10

14

for(int i=n-1;i<n;n--)

の(本当に短い)表を描いてみましょうn = 40

  i  |  n
-----+-----
 39  | 40    i < n ? true
 39  | 39    i < n ? false

したがって、最初の繰り返しの後にループを終了します

明確化:

i反復ごとに更新されると思うので混乱していると思いますが、それがポイントです-そうではなく、その値は固定されており、n変化しているだけです。

于 2013-07-17T06:44:16.873 に答える
7

このループは 1 回だけ実行されます。検討:

 for(int i=n-1;i<n;n--)
  • n == 40、最初の反復で、i = 39.
  • 条件i < nは真 ( 39 < 40 == true) なので、初めてループに入ります。
  • 最初のループの最後に、n39 にデクリメントされます
  • 条件i < nは false ( 39 < 39 == false) であるため、ループを 2 回通過することはありません。

nでは、減らす代わりに増やすとどうなるでしょうか。それは永遠に実行されますか?

  for(int i=n-1;i<n;n++)

答えは「おそらく、おそらくそうではない」です。

  • 最終的にn、整数に格納できる最大値に到達しますINT_MAX( で定義されてlimits.hおり、私のシステムでは 2,147,483,647 です)。
  • よりも大きな整数を作成すると、整数オーバーフローが発生しINT_MAXます。
  • 符号付き整数での整数オーバーフローの結果はundefinedです。つまり、結果は何でもかまいません (実際、プログラムがクラッシュする可能性があります)。

ただし、ほとんどのシステムでは、値はおそらくINT_MIN-2,147,483,648 にラップします。

  • これが発生i < nすると、 false になり、ループが終了します。

ただし、符号付き整数の整数オーバーフローは未定義の動作であるため、これが発生するかどうかはわかりません。このような状況を避けるために、プログラムを作成することをお勧めします。


本当に永久に実行したい場合は、次のように記述してください。

while(1) { ... }

また

for(;;) { ... }

これらの 2 つのループには、無限ループを記述する一般的な方法であるという利点があるため、他のプログラマーが簡単に読み取ることができます。

于 2013-07-17T06:45:04.557 に答える
3

その理由は、iデクリメントされないため、ループは 1 回だけです。

 i=39 n=40
 i=39 n=39  -> stop

デクリメントするには、次のようにi書く必要があります。

 for(int i = n-1;i<n;n--,i--)
于 2013-07-17T06:43:26.020 に答える
2

nint は符号付きで、値の範囲は -2147483648 ~ 2147483647 (x86) であるため、いつかアンダーフローします。いつか、n が i よりも正になることがあります。

編集: ループには最大1回の繰り返しがあります。

編集 2: n の値が -2147483648 の場合、ループには反復がありません。たとえば、-2147483648 - 1 は値を正にするためです (2 の補数の整数演算)。しかし、前提条件は n が負でない可能性があるため、これは決して当てはまりません。

于 2013-07-17T06:41:31.173 に答える
2

i は、ループの開始時に一度だけ設定されます。たとえば、ユーザーが 10 を入力すると、i は 1 回目の反復で 9 になります。2 回目の反復で n は 1 減分され、i は 9 のままです。

于 2013-07-17T06:42:14.343 に答える
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;
}

または、他のこともできます....無限に入れるには、単純にmake ;; ループ内の他の 2 つの条件で。

于 2013-07-17T13:04:27.283 に答える
1

あなたの条件は for ループで間違っています..あなたのループで i は変更されていません n だけが変更されています これを試してください

   for(i=n-1;i<n;i--)
   {
   printf("%d\n",i);
   }
于 2013-07-17T06:54:42.803 に答える
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)
于 2013-07-17T06:44:28.280 に答える
1

これは、デクリメントしているために発生しますn。2 回目の繰り返しi < nが false の場合、ループから抜けます。

于 2013-07-17T06:42:29.083 に答える