2012-07-31 58 views

回答

5

這是實現定義爲更早的答案已經說過。

我的gcc把'ab'作爲int來處理。下面的代碼:

printf("sizeof('ab') = %zu \n", sizeof('ab')); 
printf("'ab' = 0x%08x \n", 'ab'); 
printf("'abc' = 0x%08x \n", 'abc'); 

打印:

sizeof('ab') = 4 
'ab' = 0x00006162 
'abc' = 0x00616263 

在你的代碼中,行:

char c = 'ab'; 

可被視爲:

char c = (char)(0x00006162 & 0xFF); 

所以C得到'ab'的最後一個字符的值。在這種情況下,它是'b'(0x62)。

1

因爲'ab'的類型爲intchar只能容納一個字節。

+0

這並不回答這個問題,這就是爲什麼它得到'b'而不是'a',而不是爲什麼它得到'b'而不是'ab'。 – 2012-07-31 09:56:19

+0

@JimBalter這個問題被編輯了,在我回答的時候沒有*而不是'a'*。 – ouah 2012-07-31 10:03:13

+1

P.S.由於這是一個C語言問題,''a''和''b''也有'int'類型。 – 2012-07-31 10:04:00

5

的整數多字符常數的值是實現定義的,根據標準C11(§6.4.4.4 「字符常數」 AL10 P69):

10 - [...]包含多個字符(例如, 'ab')或包含未映射到單字節 執行字符的字符或轉義序列的整數字符常量的值爲實現定義的。 [...]

+0

C90和C99標準具有相同的規則。 – 2012-08-06 21:00:16

10

根據標準,它是實現定義的。從6.4.4.4字符常量

一個整數的字符常數具有int類型。包含映射到單字節執行字符的單個字符的整數字符常量 的值是被解釋爲整數的映射字符的表示形式的 數值。 包含多個字符(例如, 'ab')或包含未映射到單字節 執行字符的字符或轉義序列的整數字符常量的值是實現定義的。

+1

@ouah,它怎麼沒有?它表明它是由實現什麼'int'值分配給多字符文字。 – hmjd 2012-07-31 09:55:42

+0

@ouah無論單個字符常量的值是多少,'b'仍然表示爲'b'。這個答案確實回答了爲什麼'b'而不是'a'(即它取決於實現),而你的答案甚至沒有涉及到這個問題。 – 2012-07-31 09:58:49

+0

@JimBalter實際上,OP編輯了他的問題以添加*而不是'a'*,這使得恕我直言改變了一些原始問題的意圖。 – ouah 2012-07-31 10:01:58

-1

後來編輯:我的回答與之前的答案是相輔相成的,很清楚地表明這是實現特定的行爲。我在OP想知道的印象之下,考慮到這一點,爲什麼編譯器選擇'b'而不是'a'。對不起,如果我的答案令人困惑。

Endianess。這就是爲什麼你得到'b'而不是'a'。 由於您的機器內存中表現如何。 而你的機器可能是小端。

在sparc或mipsbe或胳膊上試試它,你可能會得到'a'而不是'b'。

在任何情況下,我希望你不要依賴於這個實際的生產代碼。

+0

不只是恩典。即使數值本身的字符順序也是未定義的。不同的編譯器使用不同的表示方式(例如GCC vs. Visual Studio)。 – Suma 2012-07-31 11:12:40

+0

確實。但我認爲這已經由之前的答案解決了。我只是想澄清爲什麼OP可能在測試中得到'b'而不是'a'。編譯器可能會根據它運行的平臺選擇簡單的表示和訪問方式。 – 2012-07-31 11:53:59