char ch = 'AB';
printf("ch is %d\n",ch); // Output "ch is 66"
为什么打印第二个字符的十进制值,为什么不是第一个字符的十进制值?
'AB' 是一个int 字符常量。
包含多个字符(例如,'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。 C11 §6.4.4.4 10
示例:您的输出可能不同。
printf("ch is %d\n",'AB'); // prints "ch is 16706"
16706 与 0x4142 的值相同,后者是 ASCII A 和 B 的串联值。可以打印出ch is 16961 (0x4241) 或ch is 1111556096 (0x42410000) 或其他文件。这是实现定义的行为。
将16706 分配给char 要么是实现定义的行为,要么是明确定义的——取决于char 是已签名 还是未签名。一个常见的 ID 结果是分配低字节,或0x42。
`
printf("ch is %d\n", ch); // prints "ch is 66"
将char 范围之外的值分配给char 可能会引发警告。
// Example warning
// warning: overflow in implicit constant conversion [-Woverflow]
char ch1 = 'AB';
char ch2 = 16706;
此外,鉴于此类辅音的实现定义性质,以下内容也可能会发出警告:
// Example warning
// warning: multi-character character constant [-Wmultichar]
char ch1 = 'AB';
多字符字符常量的使用仅限于少数选择情况。如此之少,它更有可能是一个很好用的编码错误。