c语言转义字符

来源:互联网 发布:软件健壮性测试 编辑:程序博客网 时间:2024/05/29 09:02

今天遇到一道题:

有以下程序:
void main(){
char a, b, c, *p;
a=’\’; b=’\xbc’; c=’\0xab’; p=”\0127”;
printf(“%c %c %c %c\n”, a, b, c, *p);
}
编译时出现错误,以下叙述中正确的是()
A. 程序中只有a=’\’;语句不正确
B. b=’\xbc’;语句不正确
C. p=”\0127”;语句不正确
D. a=’\’;和c=’\0xab’;语句都不正确

答案是D,不知道为什么,于是又去复习了一下c语言的转义字符。常用的c语言转义字符如下表所示:
这里写图片描述

这道题里a= ‘\’是不正确的,必须是a= ‘\\’,因为\标识转义字符,如果是 ‘\’,那\’就会被当做转义字符,字符会缺一个单引号,语法错误,需要后面再加个单引号,如a= ‘\”,但这样得到的字符就是\’了。关于b和c,转义字符\h、\hh、\hhh斜杠后面的是1~3位八进制数,该转义字符为ASCII码等于该值的字符;转义字符\xh、\xhh的\x后面的是1~2位十六进制数,该转义字符为ASCII码等于该值的字符。所以b= ‘\xbc’是对的,相当于b=0xbc,也即十进制的-68,虽然这个数对于ASCII字符没有意义,但作为char的数值是没有错的(char是带符号八位整形,取值范围为-128~127);c= ‘\0xab’是错的,没有这个表示方法。p=“\0127”是对的,这里\012是一个转义字符,相当于八进制的12,查ASCII表可知是换行符\n,所以p相当于p= “\n7”。所以a和c变量是错的,答案选D。

不过实际编程实现了以后发现c= ‘\0xab’并没有报错,只是报了两个warning,字符最后打印的值是 ‘b’。

warning: multi-character character constant [-Wmultichar]
warning: overflow in implicit constant conversion [-Woverflow]

这是因为 ‘\0xab’ 其实是个多字符字符(multi-character character),它其实是四个字符 ‘\0’ ‘x’ ‘a’ ‘b’组成的,如果c是int类型的话,它的值会是7889250(120*256*256+97*256+98),但这里c是个char类型,所以它的值就是末尾的8bit,也就是最后一个字符 ‘b’。

最后附一下ASCII码表:
这里写图片描述