C 指定'ab'时包含单个字符的字符`
当我声明char ch='ab'时,C 指定'ab'时包含单个字符的字符`,c,char,C,Char,当我声明char ch='ab'时,ch只包含'b',为什么它不存储'a' #include <stdio.h> int main() { char ch = 'ab'; printf("%c",ch); return 0; } #包括 int main() { char ch='ab'; printf(“%c”,ch); 返回0; } 这里涉及的实际过程是什么?当使用单引号“来包含ab字符串时,您创建了一个多字符常量。程序的行为是由实现定义的,
ch
只包含'b',为什么它不存储'a'
#include <stdio.h>
int main()
{
char ch = 'ab';
printf("%c",ch);
return 0;
}
#包括
int main()
{
char ch='ab';
printf(“%c”,ch);
返回0;
}
这里涉及的实际过程是什么?当使用单引号
“
来包含ab
字符串时,您创建了一个多字符常量。程序的行为是由实现定义的,这意味着如果我有不同的编译器或操作系统,我可能会看到值a
,即使您看到值b
这不是一个好的实践,编译器应该发出警告。
如果未看到警告,请尝试使用标志-Wall
和-Wextra
启用警告进行编译(如果使用gcc
或clang
)
您可以阅读更多信息。字符文字,例如
'A'
,其类型为int
,值为'A'
,很可能为0x41(ASCII值表示A
)。
当字符文本中有超过1个字节时,例如'ab'
,结果是实现定义的。请注意,当存储在UTF-8中且超过1字节时,这同样适用于Unicode码点,表示ASCII之外的每个码点,例如'✓'代码>是一个多字符常量
在我的系统上,它仍然是int
类型,每个字节都存储在该int
的8位中,在您的系统上可能也是这样<代码>'ab'
产生值0x6162,0x61是'a'
的值,0x62是'b'
的值。将值0x6162分配给8位字符
,在字符
有符号时创建UB,因此不要这样做。在您的情况下,它将值的低8位存储在字符中,就像使用无符号字符时一样。(如果已签名字符
或已签名字符
的系统上出现已签名字符
,则不要重复此行为)
您可以测试'ab'
的值:
#include <stdio.h>
int main(void)
{
unsigned ch = 'ab';
printf("0x%04X\n",ch);
return 0;
}
#包括
内部主(空)
{
无符号ch='ab';
printf(“0x%04X\n”,ch);
返回0;
}
这将在我的系统上输出0x6162
。char ch='ab'
应给出警告,如警告:多字符字符常量
和警告:从“int”转换为“char”时溢出
。不要这样做,这是初学者不需要的特定于实现的东西。编译时启用所有警告(-Wall
使用gcc和clang,但在您的环境中可能会有所不同)。p10:“包含多个字符(例如,'ab')[…]的整数字符常量的值是实现定义的。”显然,在您的实现中,'ab'
映射到'b'
@pmg,他得到“b”的事实主要是由于将>8位的值截断为一个字符。@Jabberwocky:这也是我对他的实现的猜测。我相信,if('ab'==('a'*256+'b'))放在(“我是对的”)代码>在他的电脑上打印“我是对的:)---