-8
# include <stdio.h>

int main()
{
  int a=5;
  begin:
  if(a)
       printf("%d\n",a);
   a--;
   goto begin;
   return 0;
 }

a が 0 になると、条件が実行されない場合、このコードで出力が無限大になる理由は次のとおりです。

出力 -

 5
 4
 3
 2
 1
 0
-1
-2
and so on endless
4

3 に答える 3

3

プログラムが実際に出力する場合は0、コンパイラ (またはマシン...) に深刻な問題がある可能性があります。私の疑いは、それが印刷されないということです0が、あなたの質問は、プログラムが無限にループする理由です。

これは、if-body に print ステートメントしか含まれていないためです。したがって、a0に達すると、印刷されませんが、行は

a--;
goto begin;

まだ実行されています。マシンは従い、に戻りbegin、ループが続きます。最も簡単な解決策は、次の場合に実行するすべてのステートメントを中かっこで囲むことですa != 0

if(a){
    printf("%d\n",a);
    a--;
    goto begin;
}

return 0;

aこれにより、プログラムは0になるまでループし、その後戻ります。

しかし、本当の問題は、(このために) を使用しないことgotoです! whileこれはループを使用するのに最適な状況です:

while(a--){
    printf("%d\n", a);
}

return 0;

( while-body を囲むブレースは、ここでは厳密に必要というわけではありませんが、良い習慣です)

于 2013-07-13T19:32:03.763 に答える
1

これはifgotoステートメントが再度実行された後、 の値aがすでに 以外になっているため0です。ここで、再びgotoステートメントを取得するため、if負の値を実行して出力し続けます。

このように見てください:-

ステートメント

printf("%d\n",a);

ifcondition inが真の場合にのみ実行されます。0ここでの TRUE は、 soと等しくないものを指します。 is のprintf場合aは実行されませんが0、他の値の場合は実行されます。現在、 a--andgotoは外部で実行されるifため、何度も実行され、条件がif常に true になり、負の値が無限に出力されます。

それにもかかわらず、

私の質問は、なぜ使用しているのgotoですか?

于 2013-07-13T19:21:48.280 に答える
0
if a==1 -> Evaluates to TRUE
if a==0 -> Evaluates to FALSE
if a==-1 -> Evaluates to TRUE

したがって、表示されない 0 を除いて、数字は降順で表示されます。

于 2013-07-13T19:35:21.140 に答える