如何确定将多字符char常量赋给char变量的结果?
为什么char变量从’ab’赋值’b’而不是’a’?
char c = 'ab'; printf("c: %c\n", c);
打印:
c: b
这是早先的答案已经说明的实现。
我的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)。
根据标准,它是实现定义的。 从6.4.4.4字符常量 :
整数字符常量的类型为int。 包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值。 包含多个字符(例如,’ab’)的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的。
根据C11标准( §6.4.4.4“字符常量”al10 p69 ),整数多字符常量的值是实现定义的:
10 – […]包含多个字符(例如,’ab’)的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的 。 […]
因为'ab'
类型为int
而char
只能容纳一个字节。
后来编辑:我的答案是对之前的答案的补充,非常清楚地表明这是特定于实现的行为。 考虑到这一点,我想知道OP为什么编译器选择’b’而不是’a’。 对不起,如果我的回答令人困惑。
字节序。 这就是为什么你得到’b’而不是’a’。 因为它在你的机器内存中的表现方式。 而你的机器可能是小端。
在sparc或mipsbe或arm上试一试,你可能会得到’a’而不是’b’。
在任何情况下,我希望你不依赖于这个实际的生产代码。