
2.2.1 在语句与代码块中试验各种转义序列
如果你的系统采用\n来表示切换到下一行开头(也就是回车并换行),而你用的却是\r,那会出现什么结果?在这种情况下,你很可能看不到欢迎词。其实欢迎词还是打印出来了,只不过由于程序没有切换到新的一行,而是回到了本行的开头,因此命令提示符界面在显示下一行提示语的时候会把打印出来的欢迎词盖住。如果你想切换到下一行,但是并不想让光标回到那一行的开头,那么可以使用<linefeed>符号,该符号用双字符组\v来表示。
可以用在字符串中的以\开头的双字符组,也叫作转义序列或跳脱序列(escape sequ-ence),这是因为\符号后面的那个字符已经脱离了它本身的含义,而是跟\符号一起构成了一个新的字符,这个字符有另外的意思。下面这张表格列出了C语言中一些以\开头的双字符组:

上述转义序列都是由两个符号组成的,但它的实际含义跟那两个符号都不同,它表示的是另外一个符号,而且通常是个不可见的符号。下面举几个例子:

为了观察这几种写法的效果,我们创建名为printingExcapeSequences.c的文件,并在其中录入下面这段程序代码[1]:

这个程序通过一系列printf()语句向控制台打印多个字符串(一个语句对应一个字符串),以演示各种转义序列的用法。其中,<newline>符号,也就是转义序列\n,通常用在字符串末尾,但你也可以把它写在字符串的其他部位,甚至可以根本不在字符串里使用这个符号。第三个字符串用转义序列\"来表示字符串本身所含的双引号。大家还要注意制表符,也就是转义序列\t的用法,它可以出现在任何一个字符串中。
把代码打好之后,保存程序文件,然后在控制台窗口中采用下面两条命令来编译并运行这个程序[2]:

你应该会看到下面这样的输出结果:

请观察这段输出信息,并试着指出其中的每一块信息分别是由源代码里的哪一个printf()打印出来的。尤其要注意的是,没有使用转义序列\n的字符串是怎样显示的?如何正确输出字符串里面所带的双引号?连续采用两个转义序列\n会出现什么效果?最后,还需要注意如何采用转义序列\t让表格中的每列文字对齐。
我们在编程的时候会频繁使用printf()函数给控制台输出信息。在第24章,我们还会讲解另一种形式的printf(),它能够把字符串写到文件里面,以便长久保存。
[1] 有些printf语句比较长,可能会印成多行,但实际录入代码时应该写成一行。——译者注
[2] 命令后面的<return>都表示此处应该按下键盘输入键,也就是Enter键或Return键,这个键上可能标有 图案。——译者注