# 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
プログラムが実際に出力する場合は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 を囲むブレースは、ここでは厳密に必要というわけではありませんが、良い習慣です)
これはif、gotoステートメントが再度実行された後、 の値aがすでに 以外になっているため0です。ここで、再びgotoステートメントを取得するため、if負の値を実行して出力し続けます。
このように見てください:-
ステートメント
printf("%d\n",a);
ifcondition inが真の場合にのみ実行されます。0ここでの TRUE は、 soと等しくないものを指します。 is のprintf場合aは実行されませんが0、他の値の場合は実行されます。現在、 a--andgotoは外部で実行されるifため、何度も実行され、条件がif常に true になり、負の値が無限に出力されます。
それにもかかわらず、
私の質問は、なぜ使用しているのgotoですか?
if a==1 -> Evaluates to TRUE
if a==0 -> Evaluates to FALSE
if a==-1 -> Evaluates to TRUE
等
したがって、表示されない 0 を除いて、数字は降順で表示されます。