回答
這是實現定義爲更早的答案已經說過。
我的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)。
因爲'ab'
的類型爲int
和char
只能容納一個字節。
的整數多字符常數的值是實現定義的,根據標準C11(§6.4.4.4 「字符常數」 AL10 P69):
10 - [...]包含多個字符(例如, 'ab')或包含未映射到單字節 執行字符的字符或轉義序列的整數字符常量的值爲實現定義的。 [...]
C90和C99標準具有相同的規則。 – 2012-08-06 21:00:16
根據標準,它是實現定義的。從6.4.4.4字符常量:
一個整數的字符常數具有int類型。包含映射到單字節執行字符的單個字符的整數字符常量 的值是被解釋爲整數的映射字符的表示形式的 數值。 包含多個字符(例如, 'ab')或包含未映射到單字節 執行字符的字符或轉義序列的整數字符常量的值是實現定義的。
後來編輯:我的回答與之前的答案是相輔相成的,很清楚地表明這是實現特定的行爲。我在OP想知道的印象之下,考慮到這一點,爲什麼編譯器選擇'b'而不是'a'。對不起,如果我的答案令人困惑。
Endianess。這就是爲什麼你得到'b'而不是'a'。 由於您的機器內存中表現如何。 而你的機器可能是小端。
在sparc或mipsbe或胳膊上試試它,你可能會得到'a'而不是'b'。
在任何情況下,我希望你不要依賴於這個實際的生產代碼。
不只是恩典。即使數值本身的字符順序也是未定義的。不同的編譯器使用不同的表示方式(例如GCC vs. Visual Studio)。 – Suma 2012-07-31 11:12:40
確實。但我認爲這已經由之前的答案解決了。我只是想澄清爲什麼OP可能在測試中得到'b'而不是'a'。編譯器可能會根據它運行的平臺選擇簡單的表示和訪問方式。 – 2012-07-31 11:53:59
- 1. 將char賦值給char
- 2. Cuda char *變量賦值
- 3. 將char賦給char *
- 4. 爲char類型變量賦予多個字符的效果
- 5. 將向量元素賦值給char變量
- 6. 常量char *的字符串構造函數改變常量char *的值?
- 7. 如何在c#中爲字符串變量賦一個char值
- 8. 如何將char加入常量char *?
- 9. 將結構賦值給char數組
- 10. 如何使用Sql字符串將變量賦值給變量
- 11. 將unsigned char *賦給字符串C++
- 12. 使用指針將字符賦給char *
- 13. 將字節值賦給char數組
- 14. 如何將十六進制字符串分配給char []變量?
- 15. 將變量賦值給字符串
- 16. 從char變量中獲取數字字符串並將其重新賦值給一個整型變量
- 17. 將常量參數的const char *成員賦值爲新值
- 18. 將字符分配給字符串變量後刪除char *
- 19. 將字符串變量轉換爲char
- 20. 指定字符串爲char *變量
- 21. 如何將一個全局char變量賦值給一個數組?
- 22. 如何將變量的值賦給常量?
- 23. 如何將readAsDataURL()的值賦給變量?
- 24. 將變量賦值給結構成員
- 25. 關於將char數組賦值給另一個char數組變量時的左值
- 26. 正確地將C#默認字符串賦值給F#變量
- 27. 如何將結果處理程序的結果賦值給變量?
- 28. 如何將字符值賦給C中的整型變量?
- 29. C++錯誤:將'char *'賦值給'char [2]的不兼容類型
- 30. 如何給變量賦多個值?
這並不回答這個問題,這就是爲什麼它得到'b'而不是'a',而不是爲什麼它得到'b'而不是'ab'。 – 2012-07-31 09:56:19
@JimBalter這個問題被編輯了,在我回答的時候沒有*而不是'a'*。 – ouah 2012-07-31 10:03:13
P.S.由於這是一個C語言問題,''a''和''b''也有'int'類型。 – 2012-07-31 10:04:00