以下是引用窗前的茶在2016-1-21 17:49:56的发言:
能说的详细一点吗?
這裏有兩個原因:
第一,C語言中,char代表一個字符,但正如你知道,計算機是一切皆數値的,在內部處理上,與彙編語言一樣,C把一個數値視爲是char還是int,在於程序員需要它“表現”爲char還是int,當你需要它是一個char,那麽就解釋爲char,需要它是一個int,那么就解釋爲int,但這個數本身是不變的。本質上,計算機中所有數據都是這樣。比如十進制數値97,當你認爲此時需要它代表一個char時,就解釋爲字符'a',否則,它是數値97。C語言與彙編接近,它採取這種直接轉化的方式處理,説C語言傾向於低級語言,其中一個原因就在這裏。但要注意,其他高級語言中,在語法層面上是不允許這樣明顯的,必須要加一個轉換儀式,比如像chr(97)這樣的函數,才是把數値轉化爲字符的,哪怕這種動作其實很簡單、甚至根本就沒動作,也要這樣寫,這是編程高級語言不讚成人類閱讀機器語言的原因,畢竟代碼是寫給人看的,給機器看的另有編譯器翻譯給它們看,人不應該看與人思維接近的語言。所以,這是我前面特意強調這是C語言特色的用意是在。實際上,你之所以會就這個問題,就是因爲這種偏機器底層的語法與正常人有差異。但這是合法的。
第二,你注意函數getchar(),它的定義,就是返回一個int數據,而不是像命名中所反映的是get a char。這又是C和彙編語言的一個基本特色,即函數的返回値身兼多職,它在正常時候,返回的就是屬於char範圍內的int數値,落在0-127之間,但由於接收輸入有可能發生錯誤,即讀到的不是可以表示爲char的數據,那麽它要告訴調用者發生了錯誤,就刻意把返回値取爲-1(因爲這肯定不是char含義的數値),那麽當調用者檢查這個返回値發現是-1的時候,就知道度到的數據是不可以拿來使用的。所以,這種時候,返回値既承擔了返回char數據的角色,也兼任了返回錯誤編碼的角色,這兩種角色是不同的數據類型,但都可以納入int範圍內,故接收getchar()返回値的變量c,也必須被聲明爲int才可以。在C語言中,char經常被編譯器內置爲unsigned char,是無符號的,永遠不爲負値,但偏偏getchar()爲了表示錯誤返回-1,一旦被賦値給unsigned類型變量,就變成了很大的一個正數,此時後續的錯誤檢查語句就可能出錯。宏EOF是値是-1。還是上面那樣,現代的編程語言,基本上不再鼓勵這種兼職行爲。