1. ホーム
  2. c++

[解決済み] "\n" or '\n' or std::endl to std::cout? 重複] [重複] [重複] [重複] [重複] [重複

2023-02-22 03:59:55

質問

を使わなくなってから、もう何年も経ちます。 std::endl に書くときに行末に std::cout に書き込むとき、行末を "\n" を使うようになりました。

しかし、現在では '\n' を使うコードを見かけるようになり、何がベストなのか考えるようになりました。

一方が文字列で、もう一方が文字であることは明らかですが、これを使用する利点はあるのでしょうか。

std::cout << variable << '\n';

この上に

std::cout << variable << "\n";


遅ればせながら追加です。

この質問をしたとき、私はnewlineが '\n' がバッファをフラッシュすると思っていたようです。今、私はそれが .

デフォルトでは std::cin は、古い C stdin FILE* のストリームと std::coutstdout . 改行時のフラッシュはこの結びつきに由来する。デフォルトでは stdout はターミナルに接続されている場合、ラインバッファリングされます。つまり、新しい行はそのバッファをフラッシュします。ですから、改行を std::cout を使って改行すると、次のようになります。 stdout が流されることになります。

もし stdout がターミナルに接続されていない場合 (例えば出力がリダイレクトされていたり、 パイプ化されている場合)、あるいは std::coutstdout が壊れている場合、改行は何も流さないでしょう。

どのように解決するのですか?

実は '\n' がデフォルトであるべきです。ストリームを明示的にフラッシュしたいのでなければ (そして、いつ、何のためにそんなことをしたいのでしょうか?) 、 を使う必要はありません。 std::endl を使う必要は全くありません。 1

もちろん、多くの書籍やチュートリアルでは std::endl をデフォルトとして使用します。これは残念なことで 深刻なパフォーマンスバグ .

を使うのとほとんど違いはないと思います。 '\n' を使うか "\n" しかし、後者は(2つの)文字の配列で、一文字ずつ出力しなければならず、そのためにループを設定しなければならず、一文字の出力よりも複雑になってしまいます。もちろん、IOを行う場合、このようなことはほとんど問題になりませんが、もし疑問があれば、1文字リテラルを出力したい場合、文字列リテラル全体ではなく、文字リテラルを出力するようにしてください。

そうすることの良い副次的な効果は、コード内で を意図していることをコードで伝えることができます。 を意図したものであり、偶然そうなったのではないということをコードで伝えることができます。


1 なお std::coutstd::cin に結びつけられているため、デフォルトでは std::cout は入力操作の前にフラッシュされるので、 ユーザーが何かを入力する前にプロンプトが表示されます。