char ch;
まず、タイプchar
のch
変数を定義します。
while((ch = getchar()) != '\n' && ch != EOF);
これはループです。while
です。ループ条件は(ch = getchar()) != '\n' && ch != EOF
で、ループ本体は;
(ヌルステートメント)です。
ループ条件は、&&
(論理 "と")と2つのオペランド(ch = getchar()) != '\n'
とch != EOF
で構成されます。 &&
演算子は、常にその左のオペランドを最初に評価します。
(ch = getchar()) != '\n'
は、不等式比較です。右側は'\n'
(改行文字を表します)です。左側は代入式ch = getchar()
です。
getchar()
は、stdin
(標準入力)から文字を読み取るgetchar
関数を呼び出します。成功した場合、この文字はunsigned char
(通常は0〜255の範囲)の形式で返されます。それ以外の場合(getchar
が失敗した場合)、EOF
(これは(実装固有の)負の値です)を返します。これは、戻りタイプがgetchar
である理由です。int
です。すべての有効な文字値とをエラーインジケータで表す必要があります。
この値はch
に格納されます。
char
はあなたの実装でunsigned型である。この時点では、2つの可能性があります。この場合、正常に読み込まれた文字はそのまま格納されますが、EOF
は通常の文字にマップされます。 (いつものように)EOF
の値が-1
の場合、最終的にUCHAR_MAX
(通常は255)になります。
char
は実装の署名付きタイプです。この場合、可能なすべての文字値の半分が範囲外です(通常、符号付きchar
は-128 .. 127の範囲を持ち、128 .. 255の値を格納できません)。ここでは物事は少しぼやけてしまいます。範囲外の文字は、(実装定義の)シグナルか、他の(実装定義の)文字に変換されます。一方、EOF
はそのままで保存されます(値がCHAR_MIN
より小さい場合を除き、実装定義のシグナルや変換を得ることができます)。
代入式は、代入後の左オペランドの値を持ちます。したがって、(ch = getchar())
は、ch
という新しい値を返します(これは、上記のようにマングルされた入力文字です)。この文字を'\n'
(改行)と比較します。改行であれば、!=
はfalseを返します。&&
は直ちにfalseを返し、ループが停止します。 (、あなたの実装に応じて、他の文字あるいはEOFがあるため、上記のマングリングの'\n'
として誤検出される可能性がありますので注意してください。)
を入力文字はその右を評価するための改行、!=
利回り真と&&
進行されていない場合ハンドオペランド。ここでは、ch != EOF
を比較します。 #1の場合(char
は符号なしタイプ)、EOF
が負の値であるため、この比較は常に真です(よりエキゾチックな状況でない限り、char
/int
は同じサイズ/範囲の値をとります)私はそこに入るつもりはない)。ケース2の場合(char
が符号付きタイプの場合)、この比較はgetchar
がEOF
と返された場合(つまり、入力の最後に達したかエラーが発生した場合)、falseを返し、ループが停止します。特定の文字(通常はUCHAR_MAX
,255)をEOF
として誤って識別することもあります。そうでない場合(すなわち、ch
が'\n'
またはでない場合)、ループが繰り返され、次の文字が読み取られて調べられます。
このコードの目的は、改行または入力の終わりに達するまで入力を消費して破棄することです。
しかし、理由コードが書かれている方法の
は、(入力の終わりに達したときに永遠ので、ループ)、それは実際にはどちらか
EOF
を認識しませんか
EOF
として有効な入力を処理する(したがって、早期終了します)。最も内側の括弧で
int ch;
スタートし、あなたの方法を考え出す:
修正が
int
としてch
を宣言することです。ストリームを消費する 'getchar()'コールのby-definitionから 'ch'への代入は、" newlineエスケープシーケンスをバッファに入れたままにしておきますが、実際にはch変数にはありません "という理論全体を押しつぶす。 – WhozCraigコードが壊れています。 'getchar'は、理由のために' int'( 'char'ではなく)を返します。 – melpomene
"改行のエスケープシーケンス"とは何を意味するのか分かりません。 '\ n'(バックスラッシュ-n)のようなエスケープシーケンスは、Cのソースコードの特徴です。実行時にデータに存在するものではありません。 – melpomene