很明显,在C++中,scanf()
比cin
更可取,我想知道是否有printf()
比cout
更实用的情况。
简短回答:永远!!!在c++中,总是在printf上使用cout是有意义的,因为它提供了与printf不同的类型安全性。
使用ostream
接口(因此cout
)所能做的远远优于旧式printf()
。首先,它是类型安全,因此当您错误地使用错误的格式序列时,不会出现任何分段冲突。
一个例子。假设您必须打印出Posix fstat
函数返回的struct stat
的属性。属性的类型是使用系统相关的typedefs:定义的
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<lt;"dev_t="<lt;s.st_dev;
C++流的另一个重要优势是可扩展性。不可能扩展printf
所理解的格式化序列的集合。相反,您可以轻松地重载<<
操作符,以方便地打印您自己类型的对象。