打印字符的十进制值的程序:
#include<stdio.h>
int main(void){
char ch = 'AB';
printf("ch is %d\n",ch);
}
为什么它打印第二个字符的十进制值,为什么不打印第一个字符的十进制值?
输出 :ch is 66
Because 'AB'
是一个多字符常量,其值是实现定义的,无论是66
或不是“不可预测“虽然可预测,但原则上和实践中在不同的实现中并不相同。
通常,您只在单引号中间使用单个字符。如果您使用多个字符,
- 编译器应该对此发出警告。
- 如果对应的值
int
is "不可预测“因为它是实现定义的。当然,给定一个实现,我们希望多字符常量始终具有相同的值。
如果您使用过gcc,那么这就是发生的事情根据这个消息来源 https://gcc.gnu.org/onlinedocs/cpp/Implementation-defined-behavior.html
编译器一次计算一个字符的多字符字符常量,将先前的值左移每个目标字符的位数,然后对截断为目标宽度的新字符的位模式进行或运算特点。最终的位模式的给定类型为 int,因此无论单个字符是否有符号,都是有符号的。如果常量中的字符多于目标 int 中可以容纳的字符,编译器会发出警告,并忽略多余的前导字符。
例如,'ab'
对于具有 8 位字符的目标将被解释为‘(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')
’, and '\234a'
as ‘(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')
’
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)