前言
今天给1702班的娃们答疑,遇到了一个问题,当时很蒙,后来想了想就是之前的一个问题,当时解决了却忘了总结了,今天赶紧总结下。
正文
源程序是这样的(就作为我们的实验1)
char a = '\0x41';
printf("%x",a);
结果是个31,emmmm
看上去结果很有迷惑性,恩
其实我们只要在ASCII表里找一下0x31对应的值就好啦,是’1’。
那么我们再改成’\0x51’,’\0x61’,’\0x71’试试。
结果是一样的。
让我们再做个实验验证我们的结论:
char a = '123';
putchar(a);
这时直接打印3。
需要注意的是,上面的两个实验都会报warning,而且都是相同的
1.c:10:11: 警告:多字节字符常量 [-Wmultichar]
char a = '\0x41';
^~~~~~
1.c:10:11: 警告:隐式常量转换溢出 [-Woverflow]
那么这和哪个警告有关系呢?
第三个实验:
char a = '\0x';
printf("%c\n", a);;
这次只有多字节字符常量这个警告,输出结果为’x’.
猜测:
所以在第一个代码中,a企图通过八进制赋值,但是由于用多字节字符常量因此只接受了最后一个字符,也就是将’1’赋给了a,所以无论是’\0x51’,’\0x61’,’\0x71’,它们都一样,都只会将最后一个字符赋给a。
而在第二个代码中,我们是以默认的方式进行赋值,然而还是一个多字节字符常量,依然是以最后一个’3’赋给了a。
猜测的结论
C语言中给char变量赋值,报多字节字符常量这个warning时,似乎只将最后一个字符赋给了变量。