所有的ASCII碼都可以用“\”加數字(一般是8進制數字)來表示。而C中定義了一些字母前加"\"來表示常見的那些不能顯示的ASCII字符,如\0,\t,\n等,就稱為轉義字符,因為后面的字符,都不是它本來的ASCII字符意思了。
——以上來自百度百科轉義字符
直接看代碼吧
char c1 = '\012';
char c2 = '\0123';
char c3 = '\0a12';
printf("%c,%c,%c\n",c1,c2,c3);
猜一猜,輸出結果是什么?
……
……
……
公布答案:
在屏幕上實際輸出了一個換行符 '\n' 一個字符 '3' 一個字符 '2'
\ddd
1到3位八進制數所代表的任意字符 三位八進制
是不是有點懵啊,不是說好的八進制嗎,第一個 '\n' 的ascall碼為10,剛好等於八進制的 '\012'
為什么后兩個算出來后的值卻是 3 和 2 啊?
下面在看一組測試用例你就懂了:
char c4 = '\007';
//char c4_1 = '\400';
char c4_2 = '\377';
char c4_3 = '\0377';
char c4_4 = '\03a7';
char c4_4 = '\a07';
老規矩,猜一猜,輸出結果是什么?
……
……
……
是不是還是有點懵啊,別急,再看一張圖
下面揭曉謎題,其實 \ddd 最多只支持三位數字,並且三位數字也不是任意的,一旦大於等於八進制數 '/400 '(十進制256=8進制400)就超過了ascall碼的范圍,編譯器就會報錯。另外大於三位,或者遇到非八進制數字時則轉換結束,直接取末尾數字。所以現在再回頭去看看是不是發現很簡單吧。
以免我的表述不夠准確,在舉個小栗子:
- char ch = '\062' ch等於字符 ‘2‘ ,十進制ascall碼值為50,
該式把十進制的ascall對應值的字符賦值給ch 等同於ch = '2'; 或ch=50;
- char ch = '\0012' ch等於字符 '2' ,十進制ascall碼值為50,
過長,進行截斷。該式截取最后一個2,以字符'2'的形式 賦值給ch 等同於ch = '2'; 或ch=50;
- char ch = '\009' ch等於字符 '9' ,十進制ascall碼值為57,
該式把十進制的ascall對應值的字符賦值給ch 等同於ch = '9'; 或ch=57;
- char ch = '\0009' ch等於字符 '9' ,十進制ascall碼值為57,
過長,進行截斷。該式截取最后的9 ,以字符'9'的形式賦值給ch 等同於ch = '9'; 或ch=57;
總結:
使用 '\ddd' 方法賦值實際上是將八進制數字通過轉義字符 '\' 賦值為ascii表中對應的字符。
char ch = '\60'; char ch = 48; char ch = '0'; 這三個語句是一樣的效果。
只不過第一種是通過八進制的方式,第二種是通過10進制的方式,三種是通過字符的方式。
ascii表:
另外需要注意的是,使用字符賦值的時候,單引號‘’通常只寫一個字符。因為char類型只占一個字節,如果寫入字符過多,也只會取其中一個字符。
如:char ch = 'ABC'; 最終ch的值為'C'。
僅測試在我本地計算機,和Linux服務器都將此語句執行后,ch保存為'C'。由此猜測它們都是以小端的方式存儲數據。
何謂小端:如對於一個12345的整數,左邊的1是‘萬’位也就是我們所說的高位,而個為的5就是低位。
小端顧名思義就是先存儲小的那一端。如對於12345我們存儲的時候 54321 這樣存儲。大端存儲方式自然相反。
而,對於計算機來說,每8位二進制為一字節,也就是2個16進制數,而我們使用小端存儲 ch 時就做了這樣的事。
並且,由於ch是char類型,只能容納一個字節的數據,因此ch最終的取值為十六進制數 0x43,也就是字符 'C'。
同樣的,對於int類型也是一樣的存儲方式。