2013-08-12 73 views
8

我想執行下面的程序。整數限定符打印字符

#‎include‬ "stdio.h" 
#include "string.h" 

void main() 
{ 
    char c='\08'; 
    printf("%d",c); 
} 

我得到的輸出爲56。但對於8以外的任何數字,輸出都是數字本身,但對於8,答案是56

有人可以解釋一下嗎?

+0

請將問題放在問題中(注意**'{}'**按鈕將其格式化)並添加一個有意義的標題。 (在問題下面編輯按鈕)。 – BoBTFish

+0

對不起!我剛剛創建了此帳戶 –

+4

因爲未定義的行爲未定義。 – molbdnilo

回答

18

\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。

+2

GCC和clang都抱怨說這是一個多字符常量,所以他們似乎將它解釋爲字符'\ 0'+'8'。確實,'8'== ASCII十進制56. – DarkDust

+0

gcc 4.6.3不會抱怨。 – Oswald

+0

@Oswald:嘗試'-Wmultichar'(在我的機器上它默認是開啓的)。 – DarkDust

4

\0用於表示C/C++中的八進制數。八進制基編號是從0->7所以\08是一個多字符常量,由\0,編譯器\08作爲\0 + 8,這使得它'8'的ASCII值是56。這就是爲什麼你得到56作爲輸出。

+0

Umer''\ 08''應該是undefined,實現定義 –

+0

http://ideone.com/Kgifgy不給56 –

4

正如其他答案所說,這些數字表示八進制字符(基數8)。這意味着,你必須寫'\010' 8,'\011' 9等

還有其他的方法來寫你的分配:

char c = 8; 
char c = '\x8'; // hexadecimal (base 16) numbers 
+0

@Roddy - 不正確。在C/C++中,作爲數字文字前綴的「0」表示八進制符號 - 不是二進制。 –

7

'\08'被認爲是一個多字符常量,由\0(評估爲0)和ASCII字符8(評估爲小數56)組成。它的解釋是如何解釋的。 C99標準說:

整數字符常量的類型爲int。整數 字符常量的值包含映射到 單字節執行字符的單個字符,這是將映射字符的 表示形式的數值解釋爲整數。 包含多於一個 字符的整數字符常數(例如,「AB」),或含有一個字符或轉義序列 不映射到單個字節執行字符,是 實現定義的 值。如果整數字符常量包含單個字符或轉義序列的 ,則其值爲 時,如果char類型的值爲單個 字符或轉義序列的對象轉換爲int類型,則該值爲 。

所以,如果你將分配給'\08'東西比一個char大,像intlong,它甚至會是有效的。但是,既然你把它分配到char你「切斷」了一些部分。哪一部分可能也是實現/機器相關的。在你的情況下,它恰巧給你8(評估爲56的ASCII字符)的值。

GCC和Clang都對「警告:多字符字符常量」發出警告。

+0

備案:Visual C++ 2010警告「警告C4125:十進制數字終止八進制轉義序列」,但您必須設置/ W4(警告級別)選項,其中/ W3是默認值。 – Wacek