如何确定将多字符char常量赋给char变量的结果?

Vic*_*r S 5 c

为什么char变量从'ab'赋值'b'而不是'a'?

char c = 'ab';

printf("c: %c\n", c);
Run Code Online (Sandbox Code Playgroud)

打印:

c: b
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 10

根据标准,它是实现定义的.从6.4.4.4字符常量:

整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值. 包含多个字符(例如,'ab')的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的.


md5*_*md5 5

根据C11标准(§6.4.4.4"字符常量"al10 p69),整数多字符常量的值是实现定义的:

10 - [...]包含多个字符(例如,'ab')的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的.[...]


SKi*_*SKi 5

这是早先的答案已经说明的实现.

我的gcc将'ab'作为int处理.以下代码:

printf( "sizeof('ab') = %zu \n", sizeof('ab') );
printf( "'ab' = 0x%08x \n", 'ab' );
printf( "'abc' = 0x%08x \n", 'abc' );
Run Code Online (Sandbox Code Playgroud)

打印:

sizeof('ab') = 4
'ab' = 0x00006162
'abc' = 0x00616263
Run Code Online (Sandbox Code Playgroud)

在您的代码中,行:

char c = 'ab';
Run Code Online (Sandbox Code Playgroud)

可以认为是:

char c = (char)(0x00006162 & 0xFF);
Run Code Online (Sandbox Code Playgroud)

所以c得到'ab'的最后一个字符的值.在这种情况下,它是'b'(0x62).