[原]【C踩坑】多字节字符常量 的warning以及猜测

康艺杰 18/01/06 15:08:08

前言

今天给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时,似乎只将最后一个字符赋给了变量。

作者:XiyouLinux_Kangyijie发表于2018/1/6 15:08:08 原文链接
阅读:7评论:0查看评论