回答
这是实现定义为更早的答案已经说过。
我的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. 常量char *的字符串构造函数改变常量char *的值?
- 3. 如何在c#中为字符串变量赋一个char值
- 4. 如何将char加入常量char *?
- 5. 使用指针将字符赋给char *
- 6. 将unsigned char *赋给字符串C++
- 7. 如何将十六进制字符串分配给char []变量?
- 8. 将常量参数的const char *成员赋值为新值
- 9. 将字符分配给字符串变量后删除char *
- 10. 关于将char数组赋值给另一个char数组变量时的左值
- 11. 如何将结果处理程序的结果赋值给变量?
- 12. C++错误:将'char *'赋值给'char [2]的不兼容类型
- 13. 将变量名赋值给变量名
- 14. 将jQuery变量赋值给php变量
- 15. 将php变量赋值给javascript变量
- 16. 将javascript变量赋值给java变量
- 17. 如何将字符串变量的值赋给C++中结构的字符串变量?
- 18. 将它分配给字符串变量后删除Char *
- 19. 将值赋给char ** seg错误
- 20. 将console.log值赋给变量
- 21. 将值赋给变量
- 22. 将值赋给awk变量
- 23. char变量的java字符串迭代
- 24. 如何将%%参数赋值给变量?
- 25. 将字符串变量的值赋给另一个字符串变量
- 26. 如何以安全的方式将char **变量转换为char *&?
- 27. 无法将120的值赋予静态常量无符号字符或将值赋给常量static static unsigned int
- 28. 如何将eval的结果赋给bash脚本中的变量?
- 29. 如何将enum变量赋值给一个数值变量? Java
- 30. 如何将一个char变量与另一个char变量进行比较?
这并不回答这个问题,这就是为什么它得到'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