2013-01-09 22 views
0

在下面的代碼中比較的值是多少?存儲在非EOF變量中的值是什麼?

while ((c = getchar()) != EOF) 
     if (c == '\n') 

我知道'\n'是因爲單引號中的常量變量。我知道它代表了ASCII表格上字符的數值,對嗎?那等於110.但是什麼

((c = getchar()) != EOF) return?

由於

+0

到這裏看看:http://stackoverflow.com/questions/1782080/what-is-eof-in-the-c-programming-language – squiguy

+0

嘗試,但它沒有help..thanks – MNY

+0

你試圖問「EOF」是什麼值? – sth

回答

5

關鍵的一點是,c必須是int

int c; 

while ((c = getchar()) != EOF) { char read_value = c; /* ... */ } 

假設一個int可以比char持有更多的價值,或者至少多個值,該系統的窄多字節編碼使用*而getchar返回一個特殊的常數EOF,當它沒有讀取更多的數據時。否則,保證您可以將c轉換爲char並獲取已讀取的字符的值。

這是一個常見的錯誤申報c本身作爲一個char,在這種情況下,循環可能永遠不會終止,因爲你可能無法捕捉到的特殊價值EOF,否則將有一個完全有效的字符這將與(char)EOF無法區分。

*)例如,這將是完全正常的,如果兩者charint是32個位寬一個給定平臺上,只要,比方說,窄流只能在範圍[用值返回單元-128,128),您可以使用-200作爲EOF

+0

謝謝你的偉大答案@Kerrek!所以如果EOF輸入不是EOF,它將返回一個int,然後如果'\ n'也是一個int,那麼語句會執行?我真的很想知道......如果唯一能夠執行語句的東西是兩個都是整數..謝謝Allod – MNY

+0

@ user1959174:保證'int'可以保存所有的值, char'可以保持,'char'可以保存系統中可用的所有可能的字符,包括換行符。 –

+0

明白了!感謝您的耐心:) @Kerrek,我確定它可能會討厭處理新手問題 – MNY

2

C中的分配操作返回右值這是在等號的右邊的值。所以在這個例子中,c = getchar()返回任何字符或EOF。

+0

不完全。賦值操作的值是分配的值。這可能與等號右側的值不同,因爲右側的值將轉換爲左側的左值類型,並且此轉換可以更改該值。 –

+0

好點。我沒有想到這一點。 – ajon

1

你的問題是:

但是,什麼是:((c = getchar()) != EOF) returens?

表達式((c = getchar()) != EOF)是一個邏輯(或「布爾」)表達式 - 它是「真」或「假」。具體來說,它測試是否有東西不等於常量「EOF」。

「東西」是表達式(c = getchar())。這是一項任務;它調用getchar()函數並將返回值分配給變量c。賦值的值是分配的值;因此,表達作爲一個整體是導致以下情況發生:

  1. getchar()
  2. 它的返回值分配給c
  3. 該值則較常EOF
  4. 如果值不等於EOF,則while聲明繼續運行。
+0

謝謝@David,但是你能告訴我與'\ n'相比什麼價值嗎?我理解while語句,並試圖理解在(c =='\ n')中比較哪些值 – MNY