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