国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C語言中g(shù)etchar()的返回類型為什么是int詳解

2020-05-23 13:25:32
字體:
供稿:網(wǎng)友

前言

在C語言中有個重要的庫函數(shù)getchar(),可從終端獲得一個字符的ASCII碼值。在終端輸入字符時并非輸入一個字符就會返回,而是在遇到回車換行前,所有輸入的在C語言中有個重要的庫函數(shù)getchar(),可從終端獲得一個字符的ASCII碼值。在終端輸入字符時并非輸入一個字符就會返回,而是在遇到回車換行前,所有輸入的字符都會緩沖在鍵盤緩沖器中,直到回車換行一次性將所有字符按序依次賦給相應(yīng)的變量,在這里一定要注意最后一個字符即'/n',該字符也會賦給一個相應(yīng)的變量(當(dāng)然這要你定義的用來接收字符的變量數(shù)比你輸入的可見字符多一才可以)。

然而最近在重新閱讀K&R的《C程序設(shè)計語言》時對getchar()這個自帶的函數(shù)的返回值產(chǎn)生了疑惑。從字面上看,給函數(shù)返回的類型應(yīng)該是char型,但在示例中,卻將返回內(nèi)容賦值給了int型變量,示例代碼如下:

#include <stdio.h> /* 將輸入復(fù)制到輸出 */ int main(void){ int c; while ((c = getchar()) != EOF){ putchar(c); } return 0;}

書中給出的解釋為:

因為某些潛在的重要原因,我們在此使用int類型。

這里作者并沒有對重要原因給出明確的說明,我試著將int修改為char,發(fā)現(xiàn)程序還是能夠正常編譯與執(zhí)行,這更加讓我疑惑!經(jīng)過一翻搜索,找到的答案如下。

1、getchar()除了返回正常的字符外,還會返回輸入結(jié)束符EOF(end of file)。該函數(shù)原型如下:

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、各種數(shù)據(jù)類型能表示的數(shù)值范圍由編譯器決定。char類型在有些編譯器中定義的范圍為0~255,另外一些編譯器中定義的范圍為-128~127。當(dāng)編譯器中定義的范圍為0~255時,用char接收getchar()返回值時就會出錯。數(shù)據(jù)類型具體的定義范圍可在<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,當(dāng)用char接收時會隱式的轉(zhuǎn)化為char類型。

5、即使編譯器總定義的范圍為-128~127,程序也有可能出錯。雖然常見字符到127位就結(jié)束了。但是ASCII表中分配到的時256。128~256為拓展字符,如常用的歐元符號等均在內(nèi)。

綜上:getchar()返回的內(nèi)容用更大范圍區(qū)間的int型接收,才能使程序更加穩(wěn)健。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 枣阳市| 明星| 佳木斯市| 垦利县| 南召县| 沐川县| 明星| 滦平县| 铜川市| 开鲁县| 城步| 云安县| 万安县| 安阳市| 丰原市| 乡城县| 寻乌县| 荣昌县| 准格尔旗| 隆昌县| 洱源县| 涞水县| 太和县| 宜春市| 易门县| 遵化市| 县级市| 吴旗县| 海晏县| 阿瓦提县| 广平县| 屯留县| 安多县| 卢湾区| 云南省| 玉龙| 大庆市| 广水市| 萨迦县| 苏尼特左旗| 泸溪县|