'\ddd'轉義字符與八進制轉換


所有的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'

為什么后兩個算出來后的值卻是 32 啊?

下面在看一組測試用例你就懂了:

	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'的形式賦值給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類型也是一樣的存儲方式。

 
uploading.4e448015.gif轉存失敗 重新上傳 取消

 

 

uploading.4e448015.gif轉存失敗 重新上傳 取消

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM