欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年11月15日 14:49:07   作者:標(biāo)點(diǎn)符  
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar()的返回類型為什么是int的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

然而最近在重新閱讀K&R的《C程序設(shè)計(jì)語(yǔ)言》時(shí)對(duì)getchar()這個(gè)自帶的函數(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;
}

書中給出的解釋為:

因?yàn)槟承撛诘闹匾?,我們?cè)诖耸褂胕nt類型。

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

1、getchar()除了返回正常的字符外,還會(huì)返回輸入結(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時(shí),用char接收getchar()返回值時(shí)就會(huì)出錯(cuò)。數(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后能在我的電腦上正常編譯,時(shí)由于我的編譯器中定義的范圍為-128~127,當(dāng)用char接收時(shí)會(huì)隱式的轉(zhuǎn)化為char類型。

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

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)的一個(gè)三子棋游戲詳解流程

    C語(yǔ)言實(shí)現(xiàn)的一個(gè)三子棋游戲詳解流程

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來(lái),相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)單鏈表的基本功能詳解

    C語(yǔ)言實(shí)現(xiàn)單鏈表的基本功能詳解

    鏈表是一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)的一種線性表,它只能從前往后,不可以從后往前,在實(shí)現(xiàn)單鏈表的操作時(shí),需要用指針來(lái)操作。本文主要介紹了實(shí)現(xiàn)單鏈表的基本功能的代碼示例,具有一定價(jià)值,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • C語(yǔ)言中的時(shí)間函數(shù)clock()和time()你都了解嗎

    C語(yǔ)言中的時(shí)間函數(shù)clock()和time()你都了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的時(shí)間函數(shù)clock()和time(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 用C# 控制Windows系統(tǒng)音量的實(shí)現(xiàn)方法

    用C# 控制Windows系統(tǒng)音量的實(shí)現(xiàn)方法

    本篇文章是對(duì)使用C#控制Windows系統(tǒng)音量的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用C語(yǔ)言實(shí)現(xiàn)掃雷游戲

    使用C語(yǔ)言實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了使用C語(yǔ)言實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 解決在Mac下直接解壓C++靜態(tài)庫(kù)出現(xiàn)的問(wèn)題

    解決在Mac下直接解壓C++靜態(tài)庫(kù)出現(xiàn)的問(wèn)題

    最近在研究C++的各種編譯構(gòu)建過(guò)程,學(xué)習(xí)了一下cmake,gyp/ninja這些自動(dòng)化構(gòu)建工具后,想著自己試下用純命令行跑一遍編譯流程。在試圖把C++靜態(tài)庫(kù)編譯為動(dòng)態(tài)庫(kù)的過(guò)程中遇到了棘手的問(wèn)題,找了好久后發(fā)現(xiàn)是跟Mac平臺(tái)相關(guān)的,這里記錄一下,望對(duì)遇到類似問(wèn)題的童鞋有幫助。
    2016-12-12
  • VSCode配置C/C++環(huán)境的最新詳細(xì)教程

    VSCode配置C/C++環(huán)境的最新詳細(xì)教程

    VisualStudioCode(簡(jiǎn)稱VSCode)是Microsoft開發(fā)的代碼編輯器,它支持Windows,Linux和macOS等操作系統(tǒng)以及開源代碼,下面這篇文章主要給大家介紹了關(guān)于VSCode配置C/C++環(huán)境的最新詳細(xì)教程,需要的朋友可以參考下
    2022-12-12
  • C++基于Boost庫(kù)實(shí)現(xiàn)命令行解析

    C++基于Boost庫(kù)實(shí)現(xiàn)命令行解析

    Boost庫(kù)中默認(rèn)自帶了一個(gè)功能強(qiáng)大的命令行參數(shù)解析器,以往我都是自己實(shí)現(xiàn)參數(shù)解析的,今天偶爾發(fā)現(xiàn)這個(gè)好東西,就來(lái)總結(jié)一下參數(shù)解析的基本用法,該庫(kù)需要引入program_options.hpp頭文件,即可使用了
    2021-06-06
  • 利用C語(yǔ)言實(shí)現(xiàn)http服務(wù)器(Linux)

    利用C語(yǔ)言實(shí)現(xiàn)http服務(wù)器(Linux)

    本文將利用C語(yǔ)言實(shí)現(xiàn)一個(gè)輕量級(jí)的http服務(wù)器,使用Reactor模式,即主線程只負(fù)責(zé)監(jiān)聽文件描述符上是否有事件發(fā)生,有的話立即將該事件通知工作線程,感興趣的可以了解一下
    2022-07-07
  • C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解

    C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式示例詳解

    這篇文章主要介紹了C++ 中將一維數(shù)組轉(zhuǎn)成多維的三種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12

最新評(píng)論