转义字符
转义字符是一类特殊的字符
有一些字符无法通过键盘输入(你在键盘上可能找不到对应的按键)或者在C语言的环境下可能产生歧义
1.避免在某些环境下引起歧义
如果你想要通过printf 打出双引号,是不能直接打的。比如:
printf("老师说:"1+1=2。" ");
编译器会报错。
双引号是字符串的定界符
printf函数的第一个参数是一个字符串,在编译器的理解里第一个参数为“老师说:”,后面凭空多出现了字符,自然就报错了。
所以为了打出双引号,我们就需要使用转义字符来实现:
printf("老师说:\"1+1=2。\" ");
① \" 表示一个双引号
它的作用不只是在printf中
比如你想用字符串常量给一个字符型数组赋值,而这个字符串常量中若包括了双引号,也需要用转义字符。
例:
char a[20]="你在\"想peach\"。";
②\\ 表示一个反斜杠,避免它被解释为转义序列符
例 6\n=? 这句话直接用printf打,\n会被解释为换行符
③ \?表示一个问号(避免解释为三字母词)
④ \' 表示一个单引号
如果你想给一个字符型变量赋值为单引号,若这么写 : char x=‘ ‘’;
编译器会报错,只要加个\就不会引起误解了。
2.用于输出一些设备控制符,比如回车,换行,退格等
\b:退格符,使当前行的活跃位置(即光标)后退一个位置。
\n:换行符,使活跃位置跳到下一行的开端。
\r:回车符,使活跃位置返回当前行的开端。
\t:水平制表符,使活跃位置移动若干个位置(通常是8个)。可以理解为八个空格
\a:警告字符
……
3.用于表示ascii码
有两种形式:
①\ddd ddd表示一个八进制数 例:
printf("\141\142\143\144\145");
输出结果为abcde
因为八进制的141实际数值为十进制的97,即对应了字母a的ascii码值
值得一提的是换行符\012 也可以写作\12
也就是说打头的0其实是可以省略的
②\xddd ddd表示一个16进制数 例:
printf("1\xa\x30");
输出结果为
1
0
因为十六进制的30的实际数值是十进制的48,即对应了字符0的ascii码值
而十六进制的\xa(a是十六进制的10)的实际数值是十进制的10,对应换行符
一个有趣的现象:
printf("1\x300shi");
输出结果为1
printf("1\x30shi");
输出结果为10shi,也就是正常输出了
很有可能因为没有\x300(768)对应的ascii码值而导致输出出现了问题
根据这个原理,还有一种可能出现的问题:
printf("a\xaa");
输出结果为a
我本来是想输出
a
a
因为\xa是换行符,但是显然编译器把aa当作了我输入的十六进制数,而aa太大了因此没有输出成功
也就是说在用十六进制表示ascii码时要考虑到a~f是会被理解为十六进制数的一部分的
4.注意点
①正如我前文所提到的,有些字符有不止一种的转义字符表达方式
如换行符即可以写作\n,也可以写作\012(\12),还可以记作\xa(\x0a或\x00a);
但是我们最好使用\n,因为它通俗易懂,便于记忆
②转义字符应该被看作一个字符
③若\和它后面的字符不构成转义字符,则\被看作斜杠
例外:
\9 表示9;
我猜想是因为\后面直接跟一个数字会被编译器理解为用八进制数表示ascii码值
但是八进制数里没有9。。。