回覆列表
  • 1 # 大大方方達到

    有些人寫程式碼總是printf("%s\n",s)而不是直接puts(s),我也不太理解。printf("%s\n",s)確實是很蠢的一種寫法,【根據後來的個別回答,某些實現會把printf("%s\n",s)自動最佳化為puts(s)。這說明連編譯器都對printf("%s\n",s)看不下去了】原因是很多人上來學的就是printf(),有一種先入為主的慣性,加上對自己的程式碼質量沒有太高的要求,所以只要輸出就想到用printf()。類似的還有輸出新行符寫成printf("\n")(譚浩強就一向如此),而不是寫成putchar("\n")。======================================幾乎所有C語言教材的hello,world都是用printf輸出的。我覺得printf是“格式化輸出”,僅僅輸出一個字串是大材小用了,而且還要手動加"\n"。相比之下,puts含義明確(輸出一行文字),不用加"\n"就自動換行,是輸出一行字最簡單的方式,為什麼不用它寫hello,world呢?你說得有一定道理。問題在於你看的教材要講什麼以及講沒講。就K&R而言,在講hello,world時還介紹了\n,以及這種等價寫法。這兩個知識是用puts()不勝任的。比如,puts()本身如你所說,“不用加"\n"就自動換行”(實際是遇到\0輸出\n),這就很難引入對\n的介紹,因為不需要。如果硬要引入(比如在字串中間加\n)則顯得很不自然,而且很難解釋\0轉成\n的問題。用用puts()的另一個問題是沒法把"hello,world"分成幾段逐次輸出。而把"hello,world"分成幾段逐次輸出對於學習者深入理解“程式”這個概念、學習美化C程式格式以及領略C語言靈活的特點的是很有意義的。So,如果你的教材介紹了相關的知識,那麼使用printf()講hello,world無可非議;如果沒介紹相關知識,那就是東施效顰,還不如用puts()。=============回答一下 @an Aaron 的疑問:首先,printf("%s\n",s)從思想上來說繞了一個彎子,它的意思是把一個字串插入到%s處輸出,puts(s)則直截了當,就是輸出字串;其次,前者要用兩個實參,後者只用一個。寫程式的人都知道,寫得越多出錯的可能性越大;第三,程式碼哪個簡潔是一目瞭然的;第四,printf()與puts()函式的實現方法不同,前者要複雜得多,至少要多一個對格式字串分析的步驟。所以從執行效率上來看,顯然也是後者為優。呼叫時空間方面後者也同樣為優。============================至於 @pansz 所說的“ 因為工程上經常需要用宏重定義printf,來實現將輸出定向到其它目標的目的。如果使用多個不同的輸出函式就會顯得很麻煩。"我不能確信我是否確實理解了他所說的是怎樣一種情況。據我所知,puts()同樣能完成重新定向的功能。我希望@pansz 能進一步補充說明一下那樣寫的前提條件。

  • 中秋節和大豐收的關聯?
  • 家裡老母親常常催我結婚,好了卻她多年的心願。我想先立業她想先成家,怎麼辦?