回答
这是实现定义为更早的答案已经说过。
我的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