#5805: while(的條件)


tcps195283 (滄浪Frollo)

學校 : 國立臺中第一高級中學
編號 : 19728
來源 : [111.246.182.1]
最後登入時間 :
2013-02-06 01:34:59
a002. 簡易加法 | From: [218.170.10.61] | 發表日期 : 2011-09-12 09:14

想請問一下前輩們,

有關a002的while()內,

範例a001是填入cin<<...,

為什麼我不能填scanf()等,

比如說a002,

用cin寫會過但scanf不行,

此二者實際上有什麼差異呢? 

謝謝。 

 
#5813: Re:while(的條件)


longbiau ((~o ̄▽ ̄)o Summer)

學校 : 臺北市立中正高級中學
編號 : 8414
來源 : [203.64.138.253]
最後登入時間 :
2013-02-27 15:34:10
a002. 簡易加法 | From: [120.107.174.102] | 發表日期 : 2011-09-14 00:48

C中的scanf()會回傳匹配成功的個數,如果讀到檔案結尾符,才回傳EOF(值要視編譯器決定,通常是-1)。用Windows作業系統的話,Ctrl+Z就是檔案結尾符。
現在下面的輸入都是用scanf("%d %d %d",&a,&b,&c)去讀,
Ex 1:  Input為2 5 6,會得到3,因為這三個數字都會讀進a,b,c中。
Ex 2:  Input為4 6 z,會得到2,因為只有4 6被存進a,b中,而z並非數字,讀不進c。而此時檔案指標停在z這兒。
Ex 3:  Input為4 z 7,會得到1,因為在讀z的時候不合,強制結束scanf()的讀取,並回傳。
        此例中再加入scanf("%c",&ch),會回傳1,因為z確實可視作字元而讀進ch。
        再接下來又加入scanf("%d %d %d",&d,&e,&f),會回傳1,是因為只有7讀進d且e,f沒被讀進東西。
Ex 4:  Input為k z 7,會得到0,因為在讀k的時候不合,強制結束scanf()的讀取,並回傳。而此時檔案指標停在k這兒。
Ex 5:  Input為       ,會得到EOF,因為根本沒東西了(正確說,是讀到了檔案結尾符)。

C++中的cin是istream類別中的物件,所以有了運算子多載的設計。其中就有定義<<的多載,而<<的多載會回傳istream類別的物件。
簡單地用cin<<a<<b做例子:
cin<<a<<b;
(cin<<a)<<b;//將執行<<多載並回傳cin
(cin)<<b;
(cin<<b);//將執行<<多載並回傳cin
cin;
這時,cin會有一套機制(也是用運算子多載來實現)回傳當前的內部狀態。只有當讀到檔案結尾符或不預期錯誤時,這個狀態才會以0來表示。

我認為兩者實質上最大的差異就是:scanf()是函式而cin是物件。

 

 
ZeroJudge Forum