购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.8 输出没那么容易

在发明编程语言的过程中,会有一个让人纠结的小麻烦,那就是,自己起的名字如果和定义好的命令重名了,编译器就会出现混乱。我们把C语言语法定义好的单词称为关键字,规定编程时自己起的名字不能和关键字重名。因此,我们尽可能少地定义C语言的关键字。有些单词是C语言语法严格规定的本身有含义的命令,比如include、int,以及括号、分号、引号这样的符号,编译器要识别它们并且做出相应的操作。到目前为止,我们都在使用别人的程序,比如stdio.h、main、printf,所以我们要遵守别人定义的名字规则。要不了多久,我们就会为我们自己的程序起名字,如果别人想借用我们的程序,那么同样需要准确地写出我们所起的名字。

瑞问:“如果双引号里有关键字,行吗?”

这当然没问题,这就是在设计的时候把我们要说的话放到双引号里的原因。双引号里边的东西,对于编译器来说,没有执行的含义——基本上无论写什么,运行时都会被原样地输出到控制台上。

显示输出的“Hello World!”这句话并不是一个命令。你如果写错了,不会出现编译错误,最多是运行的结果和你想的不太一样。

瑞问:“我输入的程序有很多颜色,这有特别的含义吗?”

这不是C语言的功能,仅仅是Dec-C++这个开发环境用颜色来提示我们的输入是否正确,很多人觉得,改变颜色这个想法太棒了,但对于高手来说这无关紧要。

思考: 如果我就想输出一个双引号,那该怎么办?

瑞说:“我试了一下,不行,出错了。”

写成“printf("Hello" World!");”,不能输出双引号。这就是个大问题了,在括号里出现了三个双引号,C语言编译器没有那么聪明,它看到的是第1个双引号,然后去寻找第2个,找到后就把这两个双引号中间的部分当成你要输出的内容。之后,C语言编译器发现了第2个双引号后边的那部分内容不符合C语言的语法,于是就结束了自己的工作,跳出来跟你说,这里出错了。因此,程序这么写是不行的。

思考: 假如你是发明C语言的人,你该如何解决这个问题?或许你已经提出了解决方案。无论它是什么,这都非常重要。因为只要我们自己有想法,我们和C语言发明者之间的差距或许就仅仅是出生的早晚而已。

瑞问:“是输入两个单引号吗?”

不是,单引号有单引号的用处。C语言发明者使用“\"”来代表一个“"”,“\”叫转义符,意思是告诉C语言编译器“\”后边那个符号并不是C语言语法本身定义的含义,而仅仅是一个字符。

注意: 需要提醒你,计算机键盘上有两个斜线“/”和“\”,只有“\”是转义符。

尝试: 把刚刚的程序中的输出语句修改成“printf("Hello\"world!");”,然后保存、编译、运行。看一下输出的这句话中是否包含了一个双引号。

注意: 再次说明,每次提到程序中可能会出现的效果,你最好都把它用程序实现出来,看看是否如你想的那样。在学习编程的过程中,任何说法都不重要,只有用程序实现过,发现结果确实是这样的,才重要——耳听为虚、眼见为实。

转义符这个想法,也没多伟大,这只是一个解决方案而已。不过,转义符并不仅是为了输出一个双引号,还有很多情况需要它。如果我们试图在控制台上输出两行话,比如:

Hello

My name is

探索: 或许你会想到写两行printf。

运行结果如图1-6所示。

图1-6 代码1-2的运行结果

运行显示的结果依然是1行,因为程序运行的结果和你写程序的格式没有任何关系。或许我们可以换一个思路,这样写:

瑞说:“不行,出错了。”

C语言的编译器会以行为单位去检查这句话是否是正确的。这时候,转义符就该上场了,在输出的时候用\n代表换行。

运行结果如图1-7所示。

图1-7 代码1-4的运行结果

注意: 我想你已经发现,我希望你明白,学习编程是一个探索的过程,你会遇到一个问题,或是我给你提出一个问题,你先用自己的想法去尝试,试过所有的可能方案后,我会告诉你C语言的规则是什么。但是,如果你直接看正确答案是什么,那么你永远都学不好编程。你需要主动思考,寻找解决方案,并且亲手去写代码、去尝试,这两点做到了,再加上我的引导,你会感觉C语言非常简单,甚至还有可能提出更好的解决方案,那你真的可能会发明一门新的编程语言。

瑞问:“是不是还有其他的转义符?”

是的,还有一个有用的,\\代表一个\。如果到网上去查询其他的转义符,则会找到很多,其中有一些是早期程序的需要,现在用处不大了。 y2Gdn8ncasaaXOO7ndlShBFmgczs4QmtuFG7e9jTi9MsFpBZn5cnNgycrbpsBqZD

点击中间区域
呼出菜单
上一章
目录
下一章
×