-5

入力の説明:

プログラムは、1 つ以上のテスト ケースでテストされます。各テスト ケースは、1 つの正の数 (0 < n0 < 1, 000, 000) で構成されます。

入力ファイルの最後の行にはゼロが 1 つ含まれています (これはテスト ケースの一部ではありません)。

次のようなコードを入力しました。

int main()
{
    int n0;

    while((scanf("%d", &n0)) != 0)
    {
    ..........
    }

しかし、入力0がまだ処理されているのはなぜですか?

4

3 に答える 3

0

これは、C のあまり知られていない演算子の 1 つである "," またはシーケンス演算子を使用するのに最適な場所です。これを利用するために書き直したコードは次のとおりです。

#include <stdio.h>

int main()
  {
  char *str[] = { "123", "456", "789", "0" };
  int i = 0;
  int n0;
  int scanret;

  while((scanret = sscanf(str[i], "%d", &n0)), n0 != 0)
    {
    printf("i = %d  n0 = %d  scanret = %d\n", i, n0, scanret);
    i += 1;
    }

    printf("i = %d  n0 = %d  scanret = %d  after loop termination\n", i, n0, scanret);
  }

whileループの条件を見てください。ここで何が起こるかというと、最初に sscanf が評価され、次にテストn0 != 0が評価されます。これは 'and' または 'or' 演算子ではないことに注意してください (以下のサンプル出力を調べることで判断できます) - sscanf が実行され、 の結果がループn0 != 0のテストとして使用されます。条件の値としてその条件で評価された最後の式。whilewhile

これを実行すると、次のような出力が得られます。

i = 0  n0 = 123  scanret = 1
i = 1  n0 = 456  scanret = 1
i = 2  n0 = 789  scanret = 1
i = 3  n0 = 0    scanret = 1  after loop termination

共有してお楽しみください。

于 2013-05-17T18:33:33.980 に答える