次のコードで比較される値は何ですか?
while ((c = getchar()) != EOF)
if ( c == '\n')
'\n'
一重引用符があるため、それが定数変数であることはわかっています。アスキーテーブル上の文字の数値を表していることは知っていますよね?それは 110 に等しい。
((c = getchar()) != EOF)
戻る?
ありがとう
次のコードで比較される値は何ですか?
while ((c = getchar()) != EOF)
if ( c == '\n')
'\n'
一重引用符があるため、それが定数変数であることはわかっています。アスキーテーブル上の文字の数値を表していることは知っていますよね?それは 110 に等しい。
((c = getchar()) != EOF)
戻る?
ありがとう
重要な点は、次c
のようにする必要がありますint
。
int c;
while ((c = getchar()) != EOF) { char read_value = c; /* ... */ }
は よりも多くの値、または少なくともシステムのナロー マルチバイト エンコーディングが使用int
するより多くの値を保持できると想定されており、それ以上のデータの読み取りに失敗した場合は特別な定数を返します。それ以外の場合は、 に変換して、読み取った文字の値を取得できることが保証されています。char
getchar
EOF
c
char
c
自身を として宣言するのはよくある間違いです。この場合、特別な値 をキャプチャできないか、または と区別できない完全に有効な文字が存在するためchar
、ループが終了しない可能性があります。EOF
(char)EOF
*) たとえば、特定のプラットフォームで achar
と an の両方int
が 32 ビット幅である場合、たとえば、狭いストリームが [-128, 128) の範囲の値を持つ単位のみを返すことができる限り、まったく問題ありません。-200
として使用できますEOF
。
c では、代入演算は、等号の右側の値である右辺値を返します。したがって、この場合、c=getchar() は、文字が何であれ EOF を返します。
あなたの質問は:
しかし、何ですか:
((c = getchar()) != EOF)
returens?
式((c = getchar()) != EOF)
は論理(または「ブール」)式であり、「true」または「false」のいずれかです。具体的には、何かが定数「EOF」と等しくないかどうかをテストします。
「何か」は表現(c = getchar())
です。これは割り当てです。関数を呼び出し、getchar()
戻り値を変数に割り当てますc
。割り当ての値は、割り当てられた値です。したがって、全体としての式により、次のことが発生します。
getchar()
と呼ばれるc
EOF
EOF
、while
ステートメントは引き続き機能します。