-2
int i;
main()
{
    int t;
    for ( t=4;scanf("%d",&i)-t;printf("%d\n",i))
        printf("%d--",t--);
}

入力が 0、1、2、3 の場合、出力は次のようになります。

4--0 
3--1
2--2

プログラムの出力について説明してください。出力がそのようなものである理由を理解できません。このプログラムでループはどのように機能しますか? for ループの printf が最初に出力されないのはなぜですか?

4

3 に答える 3

2

forループを同等のループに変換しwhileます。フォームのforループ

for (initialize; condition; increment)
{
    body;
}

は次のように同等に記述できます。

initialize;
while (condition)
{
    body;
    increment;
}

incrementステートメントがループの最後でどのように終了するかに注目してください。ループ本体の後、ループの次の反復を開始する直前に実行されます。

したがって、ループは次のようになります。

int i;
main()
{
    int t;
    t = 4;
    while (scanf("%d",&i) - t)
    {
        printf("%d--", t--);
        printf("%d\n", i));
    }
}

それは役に立ちますか?

最もトリッキーな部分は、ループ条件です。条件が 0 になると、ループは終了します。 は、読み込まれた項目の数を返します。ここでは、毎回読み込まscanfれる項目に対して 1 になります。毎回 1 を返す%d場合、 1 にヒットするとループが終了します。scanft

于 2012-10-22T14:31:12.783 に答える
0

演算子の3番目のステップはfor、ループの本体が実行された後に呼び出されます。

あなたの例と言えば、これは...

for ( t=4;              // initialization statement
      scanf("%d",&i)-t; // check statement; if `false`, the loop is finished
      printf("%d\n",i)) // step statement, usually advances an iteration one step

  printf("%d--",t--);

...このように歩きます:

  1. 初期化の場合:に4を割り当てtます。
  2. チェックの場合:do scanf、結果(0)をに割り当て、i1(の結果)が;scanfに等しいかどうかをチェックします。t今のところではありません。
  3. FORループ:printfポストデクリメントに対して実行しますt(出力します4--
  4. ステップの場合:条項printf内で言及しfor、印刷します0\n
  5. チェックの場合:実行しscanf、結果(1)をに割り当て、i1が等しいかどうかをチェックしtます(デクリメントされたため、現在は3です)。
  6. FORループ:printfポストデクリメントに対して実行しますt(出力します3--
  7. ステップの場合:条項printf内で言及しfor、印刷します1\n
  8. チェックの場合:実行しscanf、結果(2)をに割り当て、i1が等しいかどうかをチェックしtます(デクリメントされたため、現在は2です)。
  9. FORループ:printfポストデクリメントに対して実行しますt(出力します2--)。
  10. ステップの場合:条項printf内で言及しfor、印刷します2\n
  11. チェックの場合:実行しscanf、結果(3)をに割り当て、i1が等しいかどうかをチェックしtます(現在は1です)。
  12. FORチェックに失敗しました=>ループが終了しました。
于 2012-10-22T14:46:54.923 に答える
0

'scanf' は、割り当てられたアイテムの数を返します。入力の場合、scanf はすべての入力に対して 1 を返します (一度に 1 つの項目を 1 つの '%d' で読み取るため)。変数 t は 4 で始まりました。これで、反復ごとの「for」の条件は次のようになります: 1-4、1-3、1-2、および 1-1 (=0) したがって、「1-1」の場合はループ本体に入らず (条件結果が 0 であるため、false を意味します)、ループを終了しました。あなたのプログラムの結果を説明してくれることを願っています。

于 2012-10-22T16:27:02.027 に答える