# 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 ステートメントしか含まれていないためです。したがって、a
0に達すると、印刷されませんが、行は
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);
if
condition 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 を除いて、数字は降順で表示されます。