打印char的十进制值的程序:
#include<stdio.h>
int main(void){
char ch = 'AB';
printf("ch is %d\n",ch);
}
为什么打印第二个字符的十进制值,为什么不是第一个字符的十进制值?
输出:ch is 66
答案 0 :(得分:9)
因为'AB'
是一个多字符常量,其值是实现定义的,它的66
是否是{#1}; 不可预测&#34 ;原则上和实践中虽然可预测在不同的实现中是不一样的。
通常,您只在单引号中间使用单个字符。如果您使用多个字符,
int
是&#34; 不可预测&#34;因为它的实现是定义的。当然,给定一个实现,我们希望多字符常量总是具有相同的值。如果您使用过 gcc ,则会发生according to this source
编译器一次评估一个字符的多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到宽度的新字符的位模式中一个目标角色。最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的。如果常量中的字符数多于目标int中的符号,则编译器会发出警告,并忽略多余的前导字符。
例如,对于具有8位字符的目标,
'ab'
将被解释为“(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')
”,而'\234a'
将被解释为“(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')
”
答案 1 :(得分:2)
char ch = 'AB';
printf("ch is %d\n",ch); // Output "ch is 66"
为什么打印第二个字符的十进制值,为什么不打印第一个字符的十进制值?
'AB'
是一个int
字符常量。
包含多个字符(例如,'ab')的整数字符常量的值,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的。 C11§6.4.4.410
示例:您的输出可能不同。
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';
使用多字符字符常量仅限于几个选择案例。很少有人认为编码错误很可能是一个很好用的。
答案 2 :(得分:1)
C11 $ 6.4.4.4(字符常数):
多个字符始终解析为<strong> int ,但确切的值是 “依赖于实现”。也就是说,不同的编译器可以解决 相同的多字符到不同的整数。这是一种便携性 问题,这也是多个人不鼓励的原因之一。
这意味着int ch = 'AB';
类型可以int
。但是,如果它被声明为类型char
,则不会保留第二个字节。
所以使用
char ch = 'A';
而不是
char ch = 'AB';
并使用%c
类型的char
格式说明符。
printf("ch is %c\n",ch);
答案 3 :(得分:-1)
Iharob是对的。 'AB'
是一个多角色,结果证明是不可预测的。如果您打算保留两个字符'AB'
,我建议将此常量声明为字符串char ab[] = "AB";
。字符串的打印可以是printf("ch is %d\n", ab[0]);
,以65
作为输出。
答案 4 :(得分:-2)
首先,该程序会发出类似
的警告4:12: warning: multi-character character constant [-Wmultichar]
In function 'int main()':
4:12: warning: overflow in implicit constant conversion [-Woverflow]
如果您了解运算符优先级的概念,将帮助您获得第二个字符(B)的十进制值的原因。在Assignment运算符中,优先级优先级从右到左开始。因此,在这种情况下,最右边的字符具有更高的优先级并存储到char ch 中,其余字符将被忽略。
#include<stdio.h>
int main(void){
char ch = 'AB'; // Here B is assigned to 'ch' and A is ignored.
char ch1 = 'ABCDEFG'; // Here G is assigned to 'ch1'
printf("ch is %d\n",ch);
printf("ch1 is '%c'\n",ch1);
}
输出:
ch is 66
ch1 is 'G'
使用赋值运算符的另一个例子:
#include<stdio.h>
int main(void){
int a = (2,3,4,5,6); // Here 6 is assigned to 'a' and remaining values are ignored.
printf("a is %d\n",a);
}
输出:
a is 6
请通过以下链接查看运营商优先顺序。 http://en.cppreference.com/w/c/language/operator_precedence