ええと、私は数ヶ月前に別の「よく知っている」Cの本(私の言語で)を読んだことがあります、そして私はこれについて何も学びません。K&Rが20ページに3つの章を書く方法は、単純に驚くべきものであり、もちろん、私は膨大な説明を期待することはできませんが、それはまた疑問を投げかけます。
この点について質問があります1.5.1本には次のように書かれています(16ページ):
main(){
int c;// <-- Here is the question
c=getchar();
while (c != EOF){
putchar(c);
c = getchar();
}
}
[...]型charは、特にそのような文字データを格納するためのものですが、任意の整数型を使用できます。微妙ですが重要な理由でintを使用しました。問題は、入力の終わりと有効なデータを区別することです。解決策は、getcharは、入力がなくなると固有の値を返すことです。この値は、実際の文字と混同することはできません。この値は、「ファイルの終わり」を表すEOFと呼ばれます。getcharが返す値を保持するのに十分な大きさの型であるとcを宣言する必要があります。cは、可能なcharに加えてEOFを保持するのに十分な大きさでなければならないため、charを使用できません。したがって、intを使用します。[...]
別の説明のためにグーグルを検索した後:
EOFは、ファイルの終わりを表す特別なマクロです(Linux:キーボードでCTRL + dを使用してこれを作成し、Windowsコマンド:CTRL + zを使用します(改行の先頭にある必要があり、その後にRETURNが続く場合があります)):多くの場合EOF = -1、ただし実装に依存します。可能な文字に対して有効な値ではない値である必要があります。このため、cはint型です(予想どおりcharではありません)。
そこで、ソースをintからcharに変更して、EOF値の取得について、何が問題なのかを確認しました...しかし、問題はありません。同じように機能します。
また、getcharがどのように私が書いたすべての文字を取得し、すべてを印刷するのかを理解していませんでした。Int型は4バイト長であるため、変数内で4文字を取ることができます。しかし、私は任意の数の文字を入れることができます、それはすべてを同じように読み書きします。そしてcharで、同じことが起こります...実際に何が起こりますか?1〜4文字を超える場合、値はどこに保存されますか?