我想執行下面的程序。整數限定符打印字符
#include "stdio.h"
#include "string.h"
void main()
{
char c='\08';
printf("%d",c);
}
我得到的輸出爲56
。但對於8
以外的任何數字,輸出都是數字本身,但對於8
,答案是56
。
有人可以解釋一下嗎?
我想執行下面的程序。整數限定符打印字符
#include "stdio.h"
#include "string.h"
void main()
{
char c='\08';
printf("%d",c);
}
我得到的輸出爲56
。但對於8
以外的任何數字,輸出都是數字本身,但對於8
,答案是56
。
有人可以解釋一下嗎?
以\0
開頭的字符表示Octal number,是基數爲8的數字系統,並使用數字0 to 7
。所以\08
是無效代表octal數字,因爲8∉[0,7],因此你得到實現定義的行爲。
可能是你的編譯器識別Multibyte Character'\08'
爲'\0'
一個字符,'8'
作爲另一併解釋爲'\08'
作爲'\0'
+ '8'
這使得它'8'
。看ASCII表之後,你會注意到的'8'
十進制值是56。
感謝@DarkDust,@GrijeshChauhan和@EricPostpischil。
\0
用於表示C/C++中的八進制數。八進制基編號是從0->7
所以\08
是一個多字符常量,由\0
,編譯器\08
作爲\0
+ 8
,這使得它'8'
的ASCII值是56
。這就是爲什麼你得到56
作爲輸出。
Umer''\ 08''應該是undefined,實現定義 –
http://ideone.com/Kgifgy不給56 –
正如其他答案所說,這些數字表示八進制字符(基數8)。這意味着,你必須寫'\010'
8,'\011'
9等
還有其他的方法來寫你的分配:
char c = 8;
char c = '\x8'; // hexadecimal (base 16) numbers
@Roddy - 不正確。在C/C++中,作爲數字文字前綴的「0」表示八進制符號 - 不是二進制。 –
值'\08'
被認爲是一個多字符常量,由\0
(評估爲0)和ASCII字符8
(評估爲小數56)組成。它的解釋是如何解釋的。 C99標準說:
整數字符常量的類型爲int。整數 字符常量的值包含映射到 單字節執行字符的單個字符,這是將映射字符的 表示形式的數值解釋爲整數。 包含多於一個 字符的整數字符常數(例如,「AB」),或含有一個字符或轉義序列 不映射到單個字節執行字符,是 實現定義的 值。如果整數字符常量包含單個字符或轉義序列的 ,則其值爲 時,如果char類型的值爲單個 字符或轉義序列的對象轉換爲int類型,則該值爲 。
所以,如果你將分配給'\08'
東西比一個char
大,像int
或long
,它甚至會是有效的。但是,既然你把它分配到char
你「切斷」了一些部分。哪一部分可能也是實現/機器相關的。在你的情況下,它恰巧給你8
(評估爲56的ASCII字符)的值。
GCC和Clang都對「警告:多字符字符常量」發出警告。
備案:Visual C++ 2010警告「警告C4125:十進制數字終止八進制轉義序列」,但您必須設置/ W4(警告級別)選項,其中/ W3是默認值。 – Wacek
請將問題放在問題中(注意**'{}'**按鈕將其格式化)並添加一個有意義的標題。 (在問題下面編輯按鈕)。 – BoBTFish
對不起!我剛剛創建了此帳戶 –
因爲未定義的行爲未定義。 – molbdnilo