12

プログラミング(C)を趣味で独学で始めたばかりです。K&Rを使っています。

 main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}

getchar() != EOF が 0 または 1 であることを確認します

何が起こっているのか理解していると思います:

  1. c には、キーボードからの次の文字が割り当てられます
  2. c は EOF かどうかをチェックします
  3. c には、EOF であるかどうかに応じて、1 または 0 が割り当てられます。
  4. 文字が出力に表示されるか、EOF がプログラムを終了する場合。

ただし、私の解決策は間違っているため、明らかに何かを理解していません:

main ()
{
    int c;

    while ((c = getchar()) != EOF)
        printf("%d\n", c);
}

これは、文字の値を出力するだけです。また、キャリッジリターンキーを押すと「10」が出力されます。

私はそれがcを印刷すると思った。ただし、1 または 0 の値ではなく、文字の値を出力しています。

c を EOF と比較した後、1 または 0 が割り当てられていることがわかります。しかし、これを示すためにどのロジックを使用できるかわかりません。どうにかして文字値を表示することから抜け出し、代わりに比較値を表示する必要があるようです。while ループから抜け出す必要があるということですか? もしそうなら、私はその方法を知りません (これは単なる推測です)。

c = 1 または 0 であることを簡単に確認するにはどうすればよいですか?

また、どうすればこれを知ることができますか?ここから学ぶべき基本的なことがあるはずです。

main ()
{
    int c;

    while ((c = getchar()) != EOF != 0 != 1)
        putchar(c);
}

私もこれを行いましたが、これはうまくいくようです。文字は出力されませんが、これが彼らが探している解決策であるかどうかはわかりません...

4

8 に答える 8

13

EOF と比較した後、 c に 1 または 0 が割り当てられていることがわかっています

いいえ、そうではありません。見て:

while ((c = getchar()) != EOF)

式は:(c = getchar()) != EOFで、これには別の式: が含まれており、キーボードから文字(c = getchar())に割り当てられます。0 または 1 にはなりません! 式の結果です。このコードを試してください:cc

int main()
{
   char value;
   int c;
   value = ((c = getchar()) != EOF);
   printf("%i\n", value);
   return 0;
}

このコードは式の値を出力します(c = getchar()) != EOF。実際、コードは次のように記述できます。

int main ()
{
    int c;
    char value = ((c = getchar()) != EOF);
    while (value)
    {
        printf("%d\n", c);
        value = ((c = getchar()) != EOF);
    }
    return 0;
}

式はwhileもう存在せず、その結果は に代入されvalueます。上記のコードとあなたのコードは、まったく同じ出力を生成します。


編集:

main ()
{
    int c;

    while ((c = getchar()) != EOF != 0 != 1)
        putchar(c);
}

上記のコードは解決策ではありません! 書き直したコードは次のとおりです。

main ()
{
    int c;
    char value1;
    char value2;
    char value3;

    value1 = ((c = getchar()) != EOF);
    value2 = value1 != 0;
    value3 = value2 != 1;
    while (value3)
    {
        putchar(c);
        value1 = ((c = getchar()) != EOF);
        value2 = value1 != 0;
        value3 = value2 != 1;
    }
}

それでどうなるの?getchar文字「A」を返すとしましょう。この意味は:

  • value1'A' は とは異なるため、 は 1 に等しくなりEOFます。
  • value2value1(これは 1 に等しい) は 0 とは異なるため、1 に等しくなります。
  • value3value2(これは 1 に等しい) は 1 と変わらないため、 は 0 に等しくなります:while(value3)は nowwhile(0)であるため、文字は出力されません。

比較式 (少なくとも 1 つの比較演算子を含む式) の結果を変数に割り当てることができ、この種の式の結果は 0 (false の場合) または 1 (true の場合) になることを理解することが重要です。 .


OPのコメントについてのいくつかの言葉:

ねえ、ありがとう。しかし、K&R は、「これは、c を 1 または 0 に設定するという望ましくない効果がある」と明示的に述べています。たぶんこれが私が混乱している理由です。

cwhileが次のように見える場合、0 または 1 が割り当てられます。

while (c = getchar() != EOF)

operator!=は operator よりも優先度が高くなります=。つまり、getchar() != EOFが最初に評価され、次にその結果が に割り当てられcます。

于 2013-07-19T12:17:34.833 に答える
6

質問が古いことに気付きましたが、選択された回答は、質問が意図したものではないことに答えています。(本とは別の質問です)私はいくつかのことを明確にするためにここにいます.Googleでこの質問を検索した他の人が私の答えを読んで、The C Programming Language 2ndの質問1〜6をよりよく理解できることを願っています.版。

getchar () != EOF IS 0 OR 1 であることを確認してください

その本はそれを暗示した

**c = (getchar() != EOF)**

と同等です

**c = getchar() != EOF**

getchar() != EOFテストされると、

入力が でない 場合は true である必要があるため、この意味でa 、または aをEOF返します。True1

そしてもちろん、入力 EOFの場合、は、またはgetchar() != EOFを返します。False0

そのため、1または0が に割り当てられcます。

この本で言及されている「望ましくない効果」については、元の入力でもそうでもないため10これは、出力される予定の元の文字が失われることを意味し、これは望ましくありません。

演習では、これを使用します。

#include <stdio.h>

main()
{
    int c;
    while ( c = getchar() != EOF ) {
        printf("%d\n", c);
    }
}

入力が でない場合、出力EOFされます1

入力がEOFの場合、プログラムは終了します。

注:EOF Windows で入力するには、Ctrl + Z

編集:

K&R の演習 1.6 の簡単な解決策。

printf("%d", getchar() != EOF);
于 2015-01-24T01:56:21.740 に答える
3

'c' には getchar からの値が割り当てられ、EOF かどうかがチェックされます。

EOF が割り当てられていない場合は、'c' の値を出力します。そうでない場合は、ループが存在します。

EOF のテストは 'c' に値を再割り当てせず、成功または失敗するだけです

IOW、ステップ 3 を削除します。

于 2013-07-19T12:13:21.347 に答える
1

ここcは比較結果に代入されません。value read form File.

比較の結果を確認するには、次のようにする必要があります

int 結果 = ((c = getchar()) != EOF)

次に、結果を使用して、0 または 1 であることを確認します。

printf("%d",result);
于 2013-07-19T12:20:54.953 に答える
0

DevC++ 4.9.9.2 内の C ソース ファイルを使用しています。私は C でのプログラミングが初めてで、K/R 2nd Ed を使用しています。私のガイドとして。上記のステートメントを確認した後、次の行が例 1.6/1.7 で必要な出力を提供していることがわかりました。私の理解を自由に修正してください。ただし、括弧の使用と while ループの内側と外側の両方の出力に関する著者のヒントを取り上げることで、1 または 0 の結果を取得できます。最後の getchar() は印刷されたステートメントを確認するために入力/出力画面を開いたままにするという Dev-C 環境の要件。

main()
{
      int c; 
      while (c=getchar() !=EOF)
            printf("%d",c);
      printf("%d",c);
      getchar();      
于 2016-09-09T06:27:23.687 に答える