【问题标题】:Are there any major advantages to using printf() over cout in C++? [duplicate]在 C++ 中使用 printf() 而不是 cout 有什么主要优势吗? [复制]
【发布时间】:2013-01-23 07:35:46
【问题描述】:

很明显,在 C++ 中scanf()cin 更可取,我想知道是否有任何情况printf()cout 更实用。

【问题讨论】:

  • 我无法提供完整的答案,因为我不记得细节,但在 C++ 标准委员会成员(他为 Facebook 工作)的一次谈话中,他提到他更喜欢 printf()因为 cout 不能很好地处理线程。
  • 我很好奇 C++ 中的哪些情况scanf()cin 更可取。
  • @DaveRager 我发现使用scanf() 输入和解释某些字符串更容易。这是我用 C 语言编写的第一个计算器程序中的一行:scanf("%f%c%f", &num1, &op, &num2)op 是代表mathematica 运算符(+、-、*、/)的变量,如果使用得当,可以减少几十行无用的代码。

标签: c++ printf scanf cout cin


【解决方案1】:

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

【讨论】:

  • 毫无疑问,cout 有一些优势,但事实上 cout 不是线程安全的,这使得 printf 在某些方面更胜一筹 :),所以特别是在调试时,如果您是多线程环境,请避免使用 cout 等。 ..
【解决方案2】:

使用ostream 接口(所以cout)可以做的事情远远优于旧样式printf()。首先,它是类型安全,因此当您错误地使用错误的格式序列时,您不会出现任何分段违规。

一个例子。想象一下,您必须打印出 Posix fstat 函数返回的 struct stat 的属性。属性的类型是使用系统相关的 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 这样的东西在不同的系统上是不同的类型(typedefs)。你可能会发现在你的特定系统上dev_t 相当于int,并写下:

printf("dev_t=%d", s.st_dev);

它可以在你的系统上运行,但是当你在另一个系统上编译它时,例如,dev_t 不是int,而是long,那么你的代码将编译,但崩溃在运行时。

如果你使用 C++ 流和重载的 << 运算符,那么东西将始终正常工作:

cout

C++ 流的另一个重要优势是可扩展性。无法扩展printf 理解的格式化序列集。相比之下,您可以轻松地重载 << 运算符以方便地打印您自己类型的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2013-07-19
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多