【发布时间】:2012-07-31 09:45:48
【问题描述】:
为什么一个char变量从'ab'的赋值得到'b',而不是'a'?
char c = 'ab';
printf("c: %c\n", c);
打印:
c: b
【问题讨论】:
标签: c
为什么一个char变量从'ab'的赋值得到'b',而不是'a'?
char c = 'ab';
printf("c: %c\n", c);
打印:
c: b
【问题讨论】:
标签: c
根据标准,它是实现定义的。来自6.4.4.4 字符常量:
整数字符常量的类型为 int。整数字符常量的值 包含映射到单字节执行字符的单个字符是 被解释为整数的映射字符表示的数值。 包含多个字符的整数字符常量的值(例如, 'ab'),或包含不映射到单字节的字符或转义序列 执行字符,由实现定义。
【讨论】:
int 值取决于实现。
这是前面的答案已经说过的定义的实现。
我的 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)。
【讨论】:
整数多字符常量的值是实现定义的,根据 C11 标准(§6.4.4.4 “字符常量”al10 p69):
10 - [...] 包含多个字符的整数字符常量的值(例如, 'ab'),或包含不映射到单字节的字符或转义序列 执行字符,是实现定义的。 [...]
【讨论】:
因为'ab' 的类型为int,而char 只能容纳一个字节。
【讨论】:
'a' 和 'b' 也有类型 int。
稍后编辑:我的回答与之前的回答相辅相成,非常清楚地表明这是特定于实现的行为。考虑到这一点,我的印象是OP想知道为什么编译器选择'b'而不是'a'。对不起,如果我的回答令人困惑。
字节序。这就是为什么你得到'b'而不是'a'。 因为它在机器内存中的表示方式。 而且你的机器可能是小端的。
在 sparc、mipsbe 或手臂上尝试一下,您可能会得到 'a' 而不是 'b'。
无论如何,我希望您不要依赖于实际的生产代码。
【讨论】: