私はCでプログラムを書いているときに、しばしば改行を単独で印刷する必要があります。私はあなたが少なくとも2つの方法でこれを行うことができることを知っています:printf("\n")
とputchar('\n')
しかし、私はどちらの方法がスタイルとおそらく効率の面で最良の選択であるかわかりません。 1つを他のものより上で使用するためのベストプラクティスはありますか?それは本当に重要ですか?Cで改行を印刷するにはprintf( " n")かputchar( ' n')を使うべきですか?
答えて
最新のコンパイラを使用している場合には、どちらの選択肢も違いはありません[1]。たとえば、次のCコードを参考にしてください。
#include <stdlib.h>
#include <stdio.h>
void foo(void) {
putchar('\n');
}
void bar(void) {
printf("\n");
}
gcc -O1
してコンパイル(最適化が有効になって)、我々はfoo
とbar
の両方で、次の(同一の)マシンコードを取得する:
movl $10, %edi
popq %rbp
jmp _putchar ## TAILCALL
両方foo
とbar
putchar('\n')
を呼び出して終了します。言い換えれば、最新のCコンパイラは、printf
の呼び出しを非常に効率的に最適化するほどスマートです。もっと明確で読みやすいと思うものを使ってください。
- 私はMSの
cl
は、近代的なコンパイラであることを考慮していません。
@ikegami - 私も頑張った。 'icc'も試してみることができますが、市販のコンパイラがgccよりも最適化されていないとすごく驚いています。関連するノートでは、gccは代わりに 'puts'の呼び出し(改行で終わると仮定します)の代わりに、ただ1つの引数(書式指定子を持たない書式文字列)で' printf'を変更することも観察しました。 – DaoWen
@DaoWen: "市販のコンパイラがgccよりも最適化されていれば非常に驚くだろう" ...組み込みシステム用のコンパイラを知っていますか?あなたは驚くだろう。そして、一般的に、私は、gccが他のどのコンパイラよりも悪化していることを暗示するわけではありません。 – Olaf
@Olaf - 私は組込みシステムプログラミングは、今日、本当にサブコンパイルされたコンパイラで立ち往生できる数少ない場所の1つだと思います。通常、標準ライブラリのサポートには欠けています。私がプログラムした最後の組み込みシステムには 'printf'も' malloc'もありませんでした。その場合、 'putchar( '\ n')'と一緒に行かなければなりません。 ;) – DaoWen
printfは、実行時にフォーマット文字列が解析されるため、はるかに低速です。もちろん、平均的な宿題プログラムや単純なProject Eulerソリューションは非常に小さく、数CPUサイクルを無駄にしても問題はありません。
printf
の文字列を解析する必要があるため、私はputchar
とします。やや速いはずですが、おそらくそれほど多くはありません。
本当に問題ではありません。私は、コンソールに印刷することは、機能の選択肢や効率の面で誰かに問題があったことは決してありませんでした。
printf
とputchar
はどちらもstdio関数なので、(ファイル記述子に直接ではなく)同じFILE
ハンドルに書き込みます。
しかし、printf
は、最初の引数が置換式とエスケープのためにスキャンする必要がある書式文字列であるため、はるかに重いです。
したがって、printf("\n")
とputchar('\n')
の両方が同じことを行いますが、後者は高速になります。
もう一方を使用するためのベストプラクティスはありますか?
スタイルを意識させる。
実行の効率が同じまたはほぼ同じであるため、大きなコードの機能を最もよく伝えるスタイルを使用します。
printf()
の機能が多い場合は、printf("\n")
のままにしてください。
は同様にputchar('\n')
とputs("")
- 1. printf( "%。17g \ n"、.1)はどうすれば印刷できますか?
- 2. N行、N行、N行を印刷することは可能ですか?C言語
- 3. nから0への印刷をforループでC++で行う
- 4. C#とASP.NETの改行バリエーションは何ですか? (\ r \ nと\ n)
- 5. prime no.sからnまで印刷するCプログラム
- 6. 印刷するには、 "\ n" はbashの
- 7. C言語でHexで '\ n'文字を印刷する方法
- 8. テキストをファイルに保存するときに\ n \ n行を改行しないのはなぜですか?
- 9. どちらが良いですか、ch = '\ n'; write(1、&ch、1);またはputchar( '\ n');
- 10. 印刷のn数
- 11. 最後のn行を除いてすべてを逆/印刷しますか?
- 12. 改行「\ n」はYAMLファイルで
- 13. Python 3.xでは\ nをいつ使うべきですか?
- 14. 印刷N素数のペア、C++
- 15. 改行/ nを改行で改行します。
- 16. printf(_( "hello、world \ n"))はどういう意味ですか?
- 17. __android_log_print改行なしで '/ n'改行CR
- 18. c printfきれいな印刷書式
- 19. 最後のn行のファイルをcを使用して印刷します。
- 20. Pythonでファイルから3番目(またはn番目)の行をすべて印刷する方法は?
- 21. C printf乱数を印刷する
- 22. フィボナッチシリーズの次のn番目の数字をC#で印刷するには?
- 23. ルビーの改行なしで何かを印刷するには
- 24. "\ n"で改行を開始できませんか?
- 25. Python '\ n'が含まれているときに改行を含むテキストを印刷する方法
- 26. n番目のページごとに何かを印刷する
- 27. MacとWindowsの電子メールアプリケーションではどの改行ですか? \ r \ nまたは\ n \ n
- 28. GDBで変数の最初のn行を印刷するには?
- 29. {n}はどうですか?と{n}は違うのですか?
- 30. XPathでのconcat()による改行(\ n)
の最適化のこの種のを心配する価値はほとんどないではありません。 :) – Almo
時期尚早な最適化を心配する – KevinDTimm
'puts(" ");'はどうでしょうか? – chux