
2.2 语句与代码块
在详细讲解语句之前,我们先回到早前的Hello, world!程序,看看代码里面的各种标点是怎么使用的。下面再列一遍程序代码,这次我们只关注其中的普通代码,因此,笔者把注释删掉了:

首先,请大家注意成对出现的标点,这种标点有起始符号以及与之相对的结束符号。我们一行一行地看下来,会发现四种成对出现的标点,也就是<与>,(与)(这一对标点出现了两次),{与},以及"与"。另外,我们还会发现一些其他标点,其中有的你可能比较熟悉,有的则或许很少见过。这些标点包括#、.、;、\、<space>(空格)与<newline>(换行[1])。这都是C语言中相当重要的标点。
仔细看看我们要打印的这条欢迎词"Hello, world!\n",大家会发现,文字位于一对双引号中,即位于左侧的双引号与右侧的双引号之间。这两个双引号之间的内容会打印到控制台上,因此,出现在这对双引号之间的其他符号(本例中是指,与!)不需要特别关注。因为我们刚才说了,这些符号是欢迎词本身的内容,它们会照原样打印到控制台上,而不会影响程序的逻辑。出现在"与"之间的是一系列字符叫作字符序列,也称为字符串(string),这样的字符串可以显示到控制台上。然而,有一个符号例外,即\符号,它在字符串里有特殊的作用。
注意,/符号与\符号在键盘上的位置不同,前者叫作slash或forward slash(斜线、斜杠),后者叫作backward slash或backslash(反斜线、反斜杠)。大家可以这样区分这两个符号:/符号看上去好像要倒向右侧,而该方向与日常阅读的方向(也就是从左到右)是相同的,因此称为前斜线或正向斜线[2];\符号看上去好像要倒向左侧,这个方向跟日常阅读的方向相反,因此称为反斜线。这两种符号在C语言里的用法不同。前面我们讲过,C语言的代码中可以出现C++风格的注释,也就是以两个斜线(即//)开头的注释,这种注释延续到本行末尾,也就是延续到有<newline>的地方(这个<newline>符号稍后会讲到)。值得注意的是,这两个斜线之间如果出现了其他字符,那么系统就不认为这是C++风格的注释,而是会解读成别的意思。在C语言里,由两个字符所构成的序列称为digraph(双字符组),这种双字符组的含义跟它所包含的那两个字符本身都不相同。双斜线(//)就属于这样一种双字符组,构成该双字符组的两个斜线必须连写,而不能在中间插入别的字符,否则系统就不会将其当成一条C++风格的注释。
欢迎词里用到了一个双字符组,也就是\n,其用来表示<newline>(换行)符号,这个符号也会输出到控制台上。C语言里还有一个双字符组\r,用来表示<carriage return>(回车)符号,我们一定要注意它跟<newline>符号之间的区别。关于这些双字符组,我们会在第19章与第21章中详细讨论。某些计算机系统需要采用\n这个双字符组,把光标切换到下一行的开头,例如,Linux系统、(某些)UNIX系统及macOS系统就是如此。在另一些UNIX系统,以及Linux/UNIX、macOS与Windows之外的系统上,需要使用\r来表示这个意思。Windows系统则需要同时使用\r与\n。这两个双字符组,其实是在模拟我们使用打字机时的操作,打字机有一个承载纸张的架子叫作carriage(“车”),它在打字过程中会带着纸张向左移动,让打字的位置逐渐右移,另外,打字机上还有一个扳手,如果你已经打到了当前行的末尾,那么操作这个扳手可以让carriage(“车”)重新回到最右,这样打字的位置就会回到最左,同时,它还会让纸张上移一行,从而使打字位置能够下移一行(或者说换一行、把打字位置切换到新的一行),这就是carriage return(回车)与newline(新行或换行)的含义。
[1] 也叫作新行,下同。——译者注
[2] 在跟反斜线(\)相对照的情况下,可以把/说成前斜线或正向斜线,如果单独提到/字符,一般说斜线或斜杠即可。——译者注