2013-02-07 33 views
1

很明显,在C++ scanf()优于cin的情况下,我想知道是否有任何情况printf()cout更实用。在C++中使用printf()比cout有什么主要优点?

+1

我不能提供完整的答案,因为我不记得细节,但在C++标准委员会成员(他为Facebook工作)的演讲中,他提到他更喜欢printf(),因为cout不会与线程一起工作良好。 –

+0

我很好奇C++'scanf()中的哪些情况比'cin'更好。 –

+0

@DaveRager我发现使用'scanf()'输入和解释某些字符串更容易。这里是我的第一个计算器程序的一行:C:'scanf(“%f%c%f”,&num1,&op,&num2)'。 'op'是一个代表数学运算符(+, - ,*,/)的变量,如果使用得当,可以减少几十行无用的代码。 – Jules

回答

3

你可以用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这样的东西在不同的系统上是不同的类型(typedef)。你可能会发现你的特定系统dev_t上等同于,比如说,int,并写:

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

,它会工作在系统上,但是当你编译另一个系统,它定义上,例如,dev_t不是int但是,比如说long,那么你的代码将会被编译,但是会在运行时崩溃。

如果使用C++流和重载<<然后操作员的东西总是会正常工作:

COUT < < “的dev_t =” < < s.st_dev;

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

4

简答:总是!!! 在C++中总是在printf上使用cout是有意义的,因为它为您提供了类似printf的安全性。

+1

毫无疑问,有与cout相关的优点,但事实上,cout不是线程安全的,使得printf在某些方面更优越:),尤其是在调试时,如果你是多线程环境,避免cout等等。 – Saqlain

相关问题