為什麼C語言中getchar()的返回型別是int?
最近在重新閱讀K&R的《C程式設計語言》時對getchar()這個自帶的函式的返回值產生了疑惑。從字面上看,給函式返回的型別應該是char型,但在示例中,卻將返回內容賦值給了int型變數,示例程式碼如下:
#include <stdio.h> /* 將輸入複製到輸出 */ int main(void) { int c; while ((c = getchar()) != EOF){ putchar(c); } return 0; }
書中給出的解釋為:
因為某些潛在的重要原因,我們在此使用int型別。
這裡作者並沒有對重要原因給出明確的說明,我試著將int修改為char,發現程式還是能夠正常編譯與執行,這更加讓我疑惑!經過一翻搜尋,找到的答案如下。
1、getchar()除了返回正常的字元外,還會返回輸入結束符EOF(end of file)。該函式原型如下:
int getchar(void) { static char buf[BUFSIZ]; static char *bb = buf; static int n = 0; if(n == 0) { n = read(0, buf, BUFSIZ); bb = buf; } return(--n >= 0)?(unsigned char) *bb++ : EOF; }
2、EOF通常在<stdio.h>檔案中被定義為-1:
#define BUFSIZ 512 #define _NFILE _NSTREAM_ #define _NSTREAM_ 512 #define _IOB_ENTRIES 20 #define EOF (-1)
3、各種資料型別能表示的數值範圍由編譯器決定。char型別在有些編譯器中定義的範圍為0~255,另外一些編譯器中定義的範圍為-128~127。當編譯器中定義的範圍為0~255時,用char接收getchar()返回值時就會出錯。資料型別具體的定義範圍可在<limits.h>檔案中找到:
#define CHAR_BIT 8 #define SCHAR_MIN (-128) #define SCHAR_MAX 127 #define UCHAR_MAX 0xff #define CHAR_MIN SCHAR_MIN #define CHAR_MAX SCHAR_MAX
4、將int改為char後能在我的電腦上正常編譯,時由於我的編譯器中定義的範圍為-128~127,當用char接收時會隱式的轉化為char型別。
5、即使編譯器總定義的範圍為-128~127,程式也有可能出錯。雖然常見字元到127位就結束了。但是ofollow,noindex" target="_blank">ASCII表 中分配到的時256。128~256為拓展字元,如常用的歐元符號等均在內。
綜上:getchar()返回的內容用更大範圍區間的int型接收,才能使程式更加穩健。