>123
>123
>^Z
>
>のように、
>123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、
>123^Z<enter>のように入力するとプログラムが終了しません。
本当ですね。正直なところ、この挙動は私は認識していませんでした。
ちなみに123^Z456<enter>と入力すると、プログラムは終了しませんが、
456は読み込まれません。
>if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、
>前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る
>動作のショートカットキーに使われていたりするのが原因でしょうか。
後者の^Zの26は、ASCIIの制御文字におけるSUBで、これをキーボードから入力する
手段が^Zです。以下Wikipediaを参照してください。
https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97
つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り
getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で
^Zより後ろの文字は返さない、ということになります。
これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。
すっきりしない回答で申し訳ありません。
>また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF)
>という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。
「C言語 体当たり学習徹底入門」では、getchar()について
『getchar()は、標準入力から1文字読み込み、その文字コードを返します。
ファイルの末尾に来たら、EOFを返します。』
と書きました。これはgetchar()(を含むCの標準ライブラリ)の仕様です。
ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる
わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって
-1ではありません。