C 指定'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字符串时,您创建了一个多字符常量。程序的行为是由实现定义的,

当我声明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
字符串时,您创建了一个多字符常量。程序的行为是由实现定义的,这意味着如果我有不同的编译器或操作系统,我可能会看到值
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'))放在(“我是对的”)在他的电脑上打印“我是对的:)---