なぜプログラムの中で最後に実行する printf でも行末に改行(\n)が必要なのか?


【質問】

Windows で実行すると右のように最後に 1 行空いたかたちになる.
ということは最後に実行されている printf での改行指示(\n)(※以下の赤色部分)は不要ではないのか?

printf("阿萬 裕久です.\n");

【回答】

a を実行する一つ前の gcc によるコンパイルでも同じように 1 行空いていることに注目してください(上図参照).
つまり,この空白行は C のプログラム特有の話ではなく,Windows のコマンドプロンプトの動作が影響しています.

仮に最後の \n を入れなかった場合,このような空白行が表示されないで,次の行がぴったりとくっついて表示されると思います.ただ,これは環境によっては思わぬ悪影響を及ぼしてしまうんです.

以下は printf の最後の \n を書いていないプログラムを Linux や Mac で動かした場合の様子になります.
このように,プログラムの実行結果とコマンドプロンプトのメッセージ([aman@k8 ~]$ )の間が改行されずにつながってしまうんです.

繰り返しになりますが,もともと Widows のコマンドプロンプトは,実行のたびに1行空くようになっている(一番上の図の gcc 実行の行を参照)ため Linux や Mac で遭遇するような問題は起きていないというのが理由です.
ただやはり,どこでも同じプログラムで問題なく動くのが理想ですので, 課題では最後の \n を忘れないようにしてください.

【もうちょっと踏み込んだ話】

ちょっと専門的な話になりますが,printf での出力はコンピュータの内部ではバッファと呼ばれる記憶領域にいったん貯められていて,その後に画面に表示される仕組みになっています.

つまり,printf で指定した内容が即座に画面に表示されるというわけではありません(そこは保証されません).それゆえ,本来はもっと前に表示されるべきであった(バッファには既に入っていて,表示待ちになっていた)文字列が後になって表示されるという場面に遭遇することもあります.

この問題に対し,\n で改行を出力すると,その時点でバッファの中身をすべて出し切るようになっていますので,上のような問題は起こらなくなります.