1

显然在某些情况下,在 C++scanf()中优于 . cin,我想知道是否有任何情况printf()cout.

4

2 回答 2

4

简短的回答:总是!!!在 c++ 中,总是使用 cout 而不是 printf 是有意义的,因为与 printf 不同,它为您提供类型安全。

于 2013-02-07T17:34:04.150 回答
3

您可以使用ostreaminterface (so cout) 做的事情远远优于 old style printf()。首先,它是类型安全的,因此当您错误地使用错误的格式序列时,您不会遇到任何分段违规。

一个例子。想象一下,您必须打印出struct statPosixfstat函数返回的属性。属性的类型是使用系统相关的 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++ 流的另一个重要优势是可扩展性。无法扩展可以printf理解的格式化序列集。相反,您可以轻松地重载<<运算符以方便地打印您自己类型的对象。

于 2013-02-07T17:35:45.450 回答