久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19203|回復: 3
打印 上一主題 下一主題
收起左側

C語言'\0'、'0'、' '、“0”、0的區別詳解

[復制鏈接]
跳轉到指定樓層
樓主
ID:244281 發表于 2018-1-20 12:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在一個微信公眾號:AutoCodes  上面看到一篇推文,感覺整理的挺好
的,分享給大家!后面有一個問題,可以一塊討論,數字0和字符0不是一
樣的吧,那數字有ASCII碼嗎?
原文如下:
【C語言】'\0'、'0'、' '、“0”、0的區別詳解
文章內容部分整理自網絡!若有冒犯請指出,我們及時更正!
在計算機中,所有的數據在存儲和運算時都要使用二進制數表示(因為計算機用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字符號還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規則,于是美國有關的標準化組織就出臺了ASCII編碼,統一規定了上述常用符號用哪些二進制數來表示。
有關字符集和編碼的內容繼續在微信公眾號:AutoCodes中推出。
需要明白的是,這里的映射關系式“字符” <-->"數字(編碼)"。
第一部分:區別第一:'\0'
是字符,其ASCII碼為0,內存中存放表示:0000 0000。
'\0'是一個ASCII控制字符,是轉義字符,代表空字符。作為字符串結尾字符。字符'\0'可以直接用ASCII碼0表示,0不管是幾進制,都是0(十進制),也就是0x00(十六進制)。
char c = '\0';
char c = 0;   //ASCII碼為0的字符賦給字符變量c
這兩個是一樣的。當你打印的時候看你以什么形式去打印,如果是 %d,那會打印出0,如果是 %c 打印出一個空格,不是輸出到屏幕上'\0'。'\0'與 0 本質上其實是一樣的,一個是ASCII碼,一個是該ASCII碼對應的字符。字符串結束符 '\0' 的 ASCII 值正好是 0。所以用0判斷和用 '\0' 判斷,結果一樣(在內存中存放一樣)。
'\0'就表示將字符'0'轉義,系統遇到'\0'時輸出一個空格,從而表示ASCII碼為0的字符(字符串結束符),而數值0和這個是一個意思,
‘\0’是字符數組或者字符串結束標志,系統在引用字符數組或者字符串的時候遇到‘\0’就會結束,在進行字符數組初始化的時候,這個‘\0’是自動加上去的。而‘0’可以作為字符數組的一個元素。
第二:'0'
'0'是數字字符,其ASCII碼為48,也就是0x30,內存中存放表示:0011 0000
第三:' '
' '空格是一個字符,其ASCII碼為32,內存中存放表示:0011 0000
比如   abcd (空格)cdefg;
存入數組時,空格作為一個字符占有一個字節的空間,我們可以把它看作一個字符去處理。而 "\0" 則是這個字符串的結束標識符,也占有一個字節的空間,表示字符串結束!
第四:"0"
"0"是字符串。
“0”代表字符串“0”,即這個字符串里只包含一個字符'0'(當然字符串結尾默認再加一個'\0')
第五:0
0是個整數,內存中表示為0000 0000,0就代表阿拉伯數字0
在邏輯運算值方面,0和'0'(ascii碼值為48)的主要區別,比如 !0 =1  !'0'=0;
字符0的ASCII碼實際上是48,C語言中字符0 只占一個字節(Byte),也就是內存中存放的是 01001000 (其中每一個0或1表示一個bit位)
而整數0, 它在內存中的表示全是0,C語言中一個整數的占4個字節,整數0在內存中的表示為: 00000000 00000000 00000000 00000000 .
如下:
    char c = '0';  //字符0
    int a = 0;     //整數0
    printf("%c, %d\n", c, a); //0,0
    printf("%d\n", c); //48   用整數形式打印字符,實際是打印c在內存中的值。
    printf("%d\n", (c+a)); //48
    printf("%c\n", (char)(c+a)); //0
輸出的結果:
0,0
48
48
0
從上面你就能看出字符0和整數0的區別了。
第二部分:內容擴展
附:如果用scanf來接收字符串的話,字符串中不能含有空格,否則將以空格作為串的結束符。如果你鍵入得是hello world 那么實際上scanf只能獲取hello 這個單詞。所以要接收空格的話可以用gets()這個函數。gets(str)是讀入一串以回車結束的字符,順序存入到以str為首地址的內存單元中,最后寫入字符串結束標志 “\0 “,
同樣在輸出字符串時要用puts(),輸出時直到遇到 \0 為止,最后輸出一個換行符。
第三部分:問題
那么,C語言中既然'\0'與空格‘ ’是不一樣的,那為什么在字符串問題中,scanf中還不能讀入空格?例如字符串"hello world",用scanf以%s格式輸入,只能輸出"hello",字符串是以‘\0’作為結尾,而‘ ’!='\0'。為什么呢?
這不是說明空格與\0等價,而是由于C語言的緩沖機制,scanf讀取數據不是從鍵盤直接讀取,因為鍵盤是字符型輸入設備,且它是中斷方式來被操作系統控制,所以這些IO設備存取速率及其低下,而內存是塊設備,讀取速度非常快,因此引入緩沖區機制來緩沖IO設備與內存的數據交換,scanf也是從緩沖區地區,而scanf函數是把空格作為緩沖區數據的分隔符,每遇到一個空格,則表示當前一段數據為可用數據,被scanf讀取,而不是空格表示字符結束而被讀入。
第四部分:遺留問題
在我們平臺上,有讀者提出這樣一個問題:在查找網上資料的過程中,看到有這么一個說法“數字的ASCII碼”,數字有ASCCII碼嗎?
讀者認為字符'0'、'1'......'9'有對應的ASCII碼,而數字0、1......9是沒有ASCII碼的。對于這個問題,給大家一塊討論~

評分

參與人數 3黑幣 +65 收起 理由
qjzyx + 5 贊一個!
白鶴859 + 10 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:248394 發表于 2018-1-25 13:57 | 只看該作者
有點繞...
回復

使用道具 舉報

板凳
ID:266116 發表于 2018-1-25 14:59 | 只看該作者
謝謝分享!
回復

使用道具 舉報

地板
ID:981034 發表于 2021-11-26 15:20 | 只看該作者
有點暈
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合九九 | 一区二区在线免费观看 | 国产午夜精品久久久 | 在线 丝袜 欧美 日韩 制服 | 亚洲小视频在线观看 | 中文字幕精品一区久久久久 | 在线观看成人免费视频 | 九色 在线 | 午夜电影网 | 日韩高清一区二区 | 亚洲免费在线播放 | 欧美在线视频网站 | 欧美黄色免费网站 | 毛片黄片| 国产欧美日韩在线 | 日韩三级 | 国产美女免费视频 | 精品国产视频在线观看 | 91视频官网 | 亚洲久在线 | 99久久精品国产一区二区三区 | 一区二区三区四区免费在线观看 | 久久久夜夜夜 | 精国产品一区二区三区 | 精品一二三区在线观看 | 成人午夜精品 | 99精品九九 | 青青久久 | 精品亚洲一区二区三区 | 青青久久| 精品国产一区二区三区久久影院 | 丁香六月激情 | 亚洲欧美精品 | 日韩精品久久久久 | 成人免费观看视频 | 中文字幕欧美在线观看 | 中文字幕亚洲一区二区三区 | 九九国产| 亚洲视频免费 | 亚洲精品乱码久久久久久久久久 | 欧美精品在线观看 |