如何解决分配`ab`时包含单个字符的char
当我声明char ch = 'ab'
时,ch
仅包含'b',为什么它不存储'a'?
#include <stdio.h>
int main()
{
char ch = 'ab';
printf("%c",ch);
return 0;
}
这里涉及的实际过程是什么?
解决方法
在使用单引号'
包含ab
字符串时,您已经创建了所谓的多字符常量。程序的行为是由实现定义的,这意味着如果我使用其他编译器或操作系统,即使您看到值a
,我也可能会看到值b
。
这不是一个好习惯,编译器应发出警告。
如果没有看到警告,请尝试使用标志-Wall
和-Wextra
(如果使用gcc
或clang
启用警告,进行编译。
您可以阅读有关此here in another answer的更多信息。
,字符文字,例如'A'
,其类型为int
,其值为'A'
,最有可能为0x41(A
的ASCII值)。
如果字符文字中的字节数超过1个,例如'ab'
,则结果是实现定义的。请注意,存储在UTF-8中且长度超过1个字节的Unicode代码点也是如此,这意味着ASCII之外的每个代码点,例如'✓'
是一个多字符常量。
在我的系统上,它仍然是int
类型,每个字节都存储在此int
的8位中,这在您的系统上也可能是这种情况。 'ab'
的值为0x6162,0x61为'a'
的值,0x62为'b'
的值。您将值0x6162分配给8位char
,并在char
为signed
时创建UB,所以不要这样做。在您的情况下,它会将值的低8位存储在char
中,就像使用unsigned char
时一样。 (如果在已签署signed char
的系统上使用char
或char
,请不要继续这种行为。)
您可以测试'ab'
的值:
#include <stdio.h>
int main(void)
{
unsigned ch = 'ab';
printf("0x%04X\n",ch);
return 0;
}
这会在我的系统上输出0x6162
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。