今天看了《C陷阱與缺陷》中對(duì) “” 與 ” 的描述,” 引起的一個(gè)字符代表一個(gè)整數(shù),整數(shù)值對(duì)應(yīng)于該字符在編譯器采用的字符集中的序列值。
“” 引起的字符串代表的是一個(gè)指向無名數(shù)組起始字符的指針。對(duì)這兩個(gè)符號(hào)產(chǎn)生了興趣,遂打開 VS2010 查看了單引號(hào)、雙引號(hào)引起的字符在內(nèi)存中的存儲(chǔ)形式。
實(shí)驗(yàn)方式很簡(jiǎn)單,分別查看 “yes”/’yes’/’ye’/’y’ 四種字符在內(nèi)存中的存儲(chǔ)形式,代碼如下:
int _tmain(int argc, _TCHAR* argv[]) { char test1[] = "yes"; int test2 = 'yes'; printf("%xn", &test2); int test3 = 'ye'; printf("%xn", &test3); int test4 = 'y'; printf("%xn", &test4); return 0; }
實(shí)驗(yàn)結(jié)果如下:
根據(jù)內(nèi)存中的存儲(chǔ)形式,發(fā)現(xiàn) ” 引起的字符串按照整數(shù)的存儲(chǔ)形式,將第一個(gè)字符識(shí)別為最高位,最后一個(gè)字符識(shí)別為最低位,按此順序存入 int 變量 4 個(gè)字節(jié)的存儲(chǔ)空間中;
“” 引起的變量按照第一個(gè)字符存儲(chǔ)在起始地址處,最后一個(gè)字符存儲(chǔ)在結(jié)束地址處。
實(shí)驗(yàn)的結(jié)果證實(shí)了《C陷阱與缺陷》中的描述,那么當(dāng) ” 引起的字符超過 4 個(gè)字節(jié)時(shí)會(huì)出現(xiàn)什么情況呢?再進(jìn)行一次實(shí)驗(yàn),代碼如下:
int _tmain(int argc, _TCHAR* argv[]) { char test1[] = "yes"; int test2 = 'yes'; printf("%xn", &test2); int test3 = 'ye'; printf("%xn", &test3); int test4 = 'y'; printf("%xn", &test4); int test5 = 'yesa'; printf("%xn", &test5); return 0; }
實(shí)驗(yàn)結(jié)果如下:
根據(jù)實(shí)驗(yàn)結(jié)果可以看到字符超過 4 個(gè)字節(jié),超出了 int 型存儲(chǔ)能力,編譯器報(bào)錯(cuò),提示常量字符太多。這樣可以有效提醒給程序猿同學(xué),有可能存在符號(hào)輸入錯(cuò)誤,但是沒有超過 int 型存儲(chǔ)能力時(shí)照單全收,沒有任何提示,存在著符號(hào)誤用的隱患,以后程序出現(xiàn)問題調(diào)試會(huì)相當(dāng)麻煩。
原文地址:https://blog.csdn.net/u013541620/article/details/43172891