|
2004/4/20 下午 09:11:58
之前老師是教我們用printf輸出,課本也都這麼用。前陣子又去買了本中文的(之前課本是英文......英文極爛......),而這本書用cout來輸出。那,這兩種用法的差別是什麼?看起來好像是從根本上就不是同一種東西?比方說printf就比較像是個function?
那,大家寫程式的時候習慣用哪一種呢?有什麼優缺點?
|
|
|
2004/4/21 上午 10:24:41
printf==>是C的標準輸出函式,是定義在stdio.h中的 cout==>是C++的標準輸出函式,是定義在iostream.h中的 兩者的功能都是搞輸出的,但是使用方法不太一樣,如在printf要輸出一個變數值,你必須要指明此變數的型態,但是若使用cout則不用指明變數的型態
|
|
|
2004/4/25 下午 04:38:49
所以除了使用的方法不太一樣以外,並沒有什麼好不好的,習慣用哪個就用哪個?
|
|
|
2004/4/25 下午 11:02:58
其實,有些不同。 一方面除了用stream的方式可以得到用OOP的好處外,如果單以程式的觀點來看,分析如下:
printf裡面有一個parser來解析那個format的字串,然後把後面的參數根據format指定的格式放入適當位置,然後再輸出,所以,裡面有一個不小的buffer用來暫存解析替換後的字串。
用cout的話,由於每一次呼叫<<,就會根據型態的不同呼叫不同的函數來輸出,對於簡單型態的輸出比較有效率,但也由於每一次呼叫<<就會產生一次函數的呼叫,因為串連多個<<時所產生的「function call」的overhead就必須要考慮進去。
更細節的部分,就可以再度進一步去trace原始碼。
知道了這兩者的這些差別,那麼,用哪個就看習慣、高興、時機而定了,沒什麼好不好的,不然。。。也沒什麼好不好的。
>所以除了使用的方法不太一樣以外,並沒有什麼好不好的,習慣用哪個就用哪個?
|
|
|
2004/4/30 下午 08:57:21
了解了,謝謝各位
|
|
|
2004/5/3 上午 09:31:22
原來printf和cout的結構差那麼多喔...我一直以為是一樣的
|
|
|
2004/5/4 下午 10:27:14
弄清楚cout跟printf的差別,是很有幫助的,小弟再班門弄斧一下: 1. 假如A+B=C,用程式來完成這個加法可以這樣寫: int a=??,b=??,c; c=a+b;//這是大家很熟悉的寫法。 當然也可以這樣做: c=sum(a,b);//這是一個函式呼叫、至於函式怎麼寫,大家應該都清楚才是。 上述的第一種方法是透過運算子,也就是'+',來完成加法,至於第二個方法,則是透過函式呼叫,所以,一個是運算子、一個是函式。 2. 如何將一個"格式化的字串"、"顯示在螢幕"上,這有兩個主題,前者是格式化、後者是讓螢幕看見東西,我們得分開來討論。 3. 談到格式化字串,很多人馬上會聯想到sprintf(),這是一個函式,能夠讓你將數字、浮點、或字串,根據你的需要,製作出你所需的輸出字串。請看上述的第一點,加法可以透過函式、或運算子來完成,使用sprintf是指透過函式來完成的,那有運算子的方式嗎?有的,就是cout的"<<"運算子,再強調一次,"<<"是運算子,與+-*/類似。當你使用cout時,其實cout是一個物件,而你正透過他特有的運算子在工作,更仔細來分析,這是運算子的overloading,屬於C++範疇,C語言是無法使用這種方法的。 4. 至於顯示在螢幕上的問題,printf可以想像成是sprintf(stdio,...),stdio指的是標準的輸出設備,在PC上指的就是螢幕囉,至於如何丟上去的,那就要不求甚解的好,同樣的,COUT你可以把他想像成螢幕,COUT就是螢幕,這是物件導向的精髓。 5. "<<"這個符號在DOS時代就已經在使用了,當時翻譯成轉向,你可以用下列的方法將檔案列印出來: PRN<<autoexec.bat 也可以把HELLO加到某個檔案裡: echo hello >> config.sys 由於這種用法比較人性化,所以C++也用了近似的表示法。
|
|
|
2004/5/5 上午 10:12:34
寫得很好!但有一點我有小小的不同意見:第五點
我覺得不是「人性化」,只是「習慣化」。
>弄清楚cout跟printf的差別,是很有幫助的,小弟再班門弄斧一下: >1. 假如A+B=C,用程式來完成這個加法可以這樣寫: >int a=??,b=??,c; >c=a+b;//這是大家很熟悉的寫法。 >當然也可以這樣做: >c=sum(a,b);//這是一個函式呼叫、至於函式怎麼寫,大家應該都清楚才是。 >上述的第一種方法是透過運算子,也就是''+'',來完成加法,至於第二個方法,則是透過函式呼叫,所以,一個是運算子、一個是函式。 >2. 如何將一個'格式化的字串'、'顯示在螢幕'上,這有兩個主題,前者是格式化、後者是讓螢幕看見東西,我們得分開來討論。 >3. 談到格式化字串,很多人馬上會聯想到sprintf(),這是一個函式,能夠讓你將數字、浮點、或字串,根據你的需要,製作出你所需的輸出字串。請看上述的第一點,加法可以透過函式、或運算子來完成,使用sprintf是指透過函式來完成的,那有運算子的方式嗎?有的,就是cout的'<<'運算子,再強調一次,'<<'是運算子,與+-*/類似。當你使用cout時,其實cout是一個物件,而你正透過他特有的運算子在工作,更仔細來分析,這是運算子的overloading,屬於C++範疇,C語言是無法使用這種方法的。 >4. 至於顯示在螢幕上的問題,printf可以想像成是sprintf(stdio,...),stdio指的是標準的輸出設備,在PC上指的就是螢幕囉,至於如何丟上去的,那就要不求甚解的好,同樣的,COUT你可以把他想像成螢幕,COUT就是螢幕,這是物件導向的精髓。 >5. '<<'這個符號在DOS時代就已經在使用了,當時翻譯成轉向,你可以用下列的方法將檔案列印出來: >PRN<<autoexec.bat >也可以把HELLO加到某個檔案裡: >echo hello >> config.sys >由於這種用法比較人性化,所以C++也用了近似的表示法。 >
|
|
|
2004/5/5 下午 05:06:51
同意長長兄的看法。 對了,您的大名該如何唸呢?是"常常"還是"掌掌"?最壞情況應該是"掌常"囉? 常看您的文章,冒昧請問一下啦!
|
|
|
2004/5/5 下午 06:46:25
>printf==>是C的標準輸出函式,是定義在stdio.h中的 >cout==>是C++的標準輸出函式,是定義在iostream.h中的 >兩者的功能都是搞輸出的,但是使用方法不太一樣,如在printf要輸出一個變數值,你必須要指明此變數的型態,但是若使用cout則不用指明變數的型態 cout 不算 function, 它是一個 class. 至於 cout << i; 則是一個 function call, 也就是 operator<<()
|
|
|
2004/5/5 下午 06:46:32
>printf==>是C的標準輸出函式,是定義在stdio.h中的 >cout==>是C++的標準輸出函式,是定義在iostream.h中的 >兩者的功能都是搞輸出的,但是使用方法不太一樣,如在printf要輸出一個變數值,你必須要指明此變數的型態,但是若使用cout則不用指明變數的型態 cout 不算 function, 它是一個 class. 至於 cout << i; 則是一個 function call, 也就是 operator<<()
|
|
|
2004/5/5 下午 09:43:46
關於 cout<<i 是function call, 沒錯,他確實是函式呼叫,但是在C++的寫作上,我們應視為運算子,這也是為什麼有 operator這個關鍵字的原因,請看我下面的例子: double a,b=??,c=??; a=b+c; 請問上面這個敘述是什麼呢,是運算、還是函式呼叫呢,對所有沒有浮點運算的CPU來說,編譯器根本就是翻譯成函式呼叫,只不過這個內部函式(通常是浮點函式庫)被隱藏而已!再舉一個例子: strcut XXX a,b={???}; a=b; 請問上面這行敘述是什麼?C/C++允許結構的指派動作(assignment),但事實上,這又是另外一個function call,雖然你完全看不出來誰呼叫了函式(當然是編譯器幫你呼叫囉)。 再回到cout<<i;這個主題來,這當然是函式呼叫,但就像上面所舉的例子一樣,寫程式的人是將他當成運算子來看待的,這也是operator這個關鍵字的用意。 話說回來,將來CPU進步後,原本需要函式幫忙的運算式,可能會有對應的指令集喔,像前面提到的浮點運算,或是複雜的陣列相乘、三角函數計算等,我想在不久的將來,這些運算子會真正擔起重任喔。
|
|
|
2004/5/7 上午 10:50:50
這是界已經有太多「掌」了,所以我喜歡被叫做「常」。 :P
>同意長長兄的看法。 >對了,您的大名該如何唸呢?是'常常'還是'掌掌'?最壞情況應該是'掌常'囉? >常看您的文章,冒昧請問一下啦! >
|
|
|
2004/5/10 下午 02:14:35
請目各位大大為何看書上printf輸出時還要多加一個%d 似乎比cout麻煩… 因為我是學C++,聽老師說printf是從C語言來的…
|
|
|
2004/5/10 下午 07:26:40
請參看我上面的文章提到關於printf部分的說明,然後接下來看: 在字串解析的時候,把%當作特別的一個符號,printf會在不同的%地方,把後面接著的參數以特別的方式變成字串取代調%的地方。
例如:%d就代表把後面的參數用該數值的10進位字串取代。%x則用16進位。
但為何要取代成字串呢?功課!
>請目各位大大為何看書上printf輸出時還要多加一個%d >似乎比cout麻煩… >因為我是學C++,聽老師說printf是從C語言來的…
|
|
|
2004/5/12 下午 02:33:21
Cout is Ostream class object , but printf is ANSI-C Library stdio(standrad I/O ) routine, Cout is safer than printf
|
|
|
2004/5/12 下午 04:03:40
cout << " hello" ; operator << is overlaoding of operator.
operator << ( const ostream& obj ) {
/* .... */
}
|
|
|
2005/3/28 下午 02:34:49
>其實,有些不同。 >一方面除了用stream的方式可以得到用OOP的好處外,如果單以程式的觀點來看,分析如下: > >printf裡面有一個parser來解析那個format的字串,然後把後面的參數根據format指定的格式放入適當位置,然後再輸出,所以,裡面有一個不小的buffer用來暫存解析替換後的字串。 > >用cout的話,由於每一次呼叫<<,就會根據型態的不同呼叫不同的函數來輸出,對於簡單型態的輸出比較有效率,但也由於每一次呼叫<<就會產生一次函數的呼叫,因為串連多個<<時所產生的「function call」的overhead就必須要考慮進去。
沒錯... 這位大哥說的沒錯... 最重要的就是因為 cout 用到了 OOP的好處... 若是學C++不知道OOP的話... 那肯定是白學囉...
|
|
|
2005/4/21 下午 11:59:14
那請問大大們.. 小弟用BC++3.1試寫一個小小程式, #include <stdio.h> void main() { float a=1.11; printf(" a=%f ",a); } compile是OK的,但執行的時候會出現這個訊息: printf : floating point formats not linked Adnormal program termination 可是我使用cout就不會有這個訊息,請教一下這個訊息的意思是??? 若我要使用printf,該要怎麼辦???????
|
|
|
2005/4/22 上午 12:50:25
printf 不做type check cout做type check 所以有時用printf是為險的 char* str= "1234"; printf("%d", str); 結果可能很嚴重 但compiler會讓你過 _____________ 但 char* str= "1234"; cout<<str; 絕對不會有run time的問題存在
|
|
|
2013/1/3 下午 06:31:52
http://en.wikipedia.org/wiki/Printf_format_string
|
|
|
2013/1/3 下午 10:50:06
>printf裡面有一個parser來解析那個format的字串.... > >用cout的話,由於每一次呼叫<<,就會根據型態的不同呼叫不同的函數來輸出, >對於簡單型態的輸出比較有效率,但也由於每一次呼叫<<就會產生一次函數的呼叫..... 如果去trace printf的函式就會發現比想像龐大; cout的parser則在編譯時期就完成了。 不論型態簡不簡單cout都比printf來得有效率。 printf的parser花費使得cout的函式呼叫顯得微不足道。 如果C++真的介意函式的呼叫花費,inline可以解決效率(但重覆的程式較佔程式空間)
|
|
|
2013/1/3 下午 11:57:58
http://unix.superglobalmegacorp.com/386BSD-0.1/newsrc/stand/printf.c.html
|
|
|
2013/1/4 下午 03:26:34
http://programming-designs.com/2009/02/c-speed-test-part-2-printf-vs-cout/
|
|
|
2013/1/4 下午 05:04:24
>http://programming-designs.com/2009/02/c-speed-test-part-2-printf-vs-cout/ 這是一個有點"腦殘"的比賽>"< 首先,在什麼平台測,時間如何取得?都沒交待。 在個強制多緒的平台做這樣的測試,可以說相當不準確! 但,這也沒關係,多測幾次,去掉較奇怪的數據(可能受interrupt影響)再做平均也免強可以看個大概。 但要先弄清楚要測的是效率還是速度? 如果是要測效率,那麼測試的雙方要做的事情就要一致。 printf是一個沒有安全檢測的函式;cout則是個有安全機制制的物件。 如果要一個壯漢扛百斤的沙包和一個無負擔的瘦夫賽跑,結果壯漢跑輸了,所以結論是瘦夫比較壯? 舉個例來說 printf("this is a string test."); printf 只是把記憶體的內容送到標準的output stream,不管死活(有沒有成功)。 cout<<"this is a string test.";則要管理旗標,計算字串長度以更和送成功的字數比較,結果還要設定旗標。 用膝蓋想也知道誰的速度較快。但效率呢? 如果寫個MyCout output stream不必有安全檢驗的負擔,保證速度也是比printf快。 其實也不必另寫一個MyCout,只要不測試字串,例如只輸出變數: int iVar; printf("%d\n", iVar); 和 cout<<iVar<<endl; 應該就會看到速度比較的結果是不一樣的。
|
|
|
2013/1/24 下午 03:37:29
http://www.sparetimelabs.com/tinyprintf/index.html
|
|
|
2013/4/9 下午 01:39:19
http://www.dreamincode.net/forums/topic/10509-printf-vs-cout-dreamincodenet/
|
|
|
|
|
|
C++ |
 |
|
|
專家等級 |
評價 |
|
|
一代宗師 |
10000 |
|
|
曠世奇才 |
5000 |
|
|
頂尖高手 |
3000 |
|
|
卓越專家 |
1500 |
|
|
優秀好手 |
750 |
|
|
|
|
|
|
|
|
|
Microsoft Internet Explorer
6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/ |
|
|