2013-02-07 38 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

相關問題