明らかに、C++ ではよりも実用的なscanf()
状況cin
があるかどうか疑問に思っていました。printf()
cout
2 に答える
簡単な答え: いつも!!! C++ の場合、printf とは異なり型の安全性が得られるため、常に printf よりも cout を使用する方が理にかなっています。
ostream
インターフェイス(so )を使用して実行できることはcout
、古いスタイルよりもはるかに優れていprintf()
ます。まず第一に、それはタイプセーフであるため、誤って間違ったフォーマットシーケンスを使用した場合にセグメンテーション違反が発生することはありません。
例。struct stat
Posixfstat
関数によって返された属性を出力する必要があると想像してください。属性のタイプは、システムに依存するtypedefを使用して定義されます。
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
/* ... more attributes */
};
つまり、のようなものdev_t
は、異なるシステム上の異なるタイプ(typedef)です。dev_t
特定のシステムでは、たとえば、と同等であることがわかり、int
次のように記述します。
printf("dev_t=%d", s.st_dev);
それはあなたのシステムで動作しますが、別のシステムでコンパイルすると、たとえば、dev_t
としてではなくint
、たとえば、を定義するとlong
、コードはコンパイルされますが、実行時にクラッシュします。
C ++ストリームとオーバーロードされ<<
た演算子を使用する場合、ものは常に正しく機能します。
cout << "dev_t =" << s.st_dev;
C ++ストリームのもう1つの重要な利点は、拡張性です。理解できるフォーマットシーケンスのセットを拡張することはできませんprintf
。対照的に、演算子を簡単にオーバーロードして<<
、独自のタイプのオブジェクトを便利に印刷できます。