C++语言简介
如果你已经用上一章介绍的方法搭建了开发环境,那么你已经有机会运行的第一个程序。祝贺你,这是一个很大的进步。
在这一章中,我将带你走进C++基本的代码块,你将会写简单的程序。我首先介绍一些你经常看的一些概念:一个程序是怎样组成的,包括main函数和被编译器识别的标准函数库。怎么样向你的程序中添加注释,和怎么样像一个编程者一样思考的简短介绍。
一个最简单C++程序
让我们通过看一个最简单的程序开始(一个不做任何事情的程序),一步一步的分析:
int main( )
{
}
Sample Code 2:empty cpp
看,不是那么可怕!
第一行
int main( )
告诉编译器有一个叫main的函数,这个函数返回integer,在C++被简化为int。函数是人们写的代码片段,经常在其中使用其他函数,或者仅仅使用一些基本的语言特征。在我们的例子中函数没有做任何事情,我们马上就会看到它做的事情。
主函数是一个特殊的函数;它是唯一一个必须包含在C++程序中的函数,它指示了程序在哪开始,什么时候运行它。(The main function is preceded by the type of its return value, int. )当一个函数返回值,调用该函数的代码可以使用这个返回值。像main函数,它的返回值返回了操作系统。通常情况下,我们需要在这里明确指定返回值,但是C++允许main函数省略return语句,它会默认返回0(告诉操作系统一切运行顺利)。
大括号,标记了程序开始和结束的地方(我们将看到其他的代码块)。你可以认为它们是有意思的开始和结束。在这个例子中,我们知道函数不做任何事情,因为在两个大括号之间没有任何内容。
当你运行这个程序时,你将不会看到任何输出,下面我们看一个更有意思(但是仅仅是一点)的程序。
#include <iostream>
using namespace std;
int main( )
{
cout << "HEY, you, I'm alive! Oh, and Hello World!\n";}
Sample Code 3:hello.cpp
首先,注意在大括号之间有内容了,这就意味着程序可以做事情了,让我们一步一步的分析这个程序。
第一行
#include <iostream>
是一个include语句,告诉编译器在创建可执行文件前,把一个叫iostream的头文件中的代码放入其中。iostream允许你使用输入、输出的功能。使用#include高效的把头文件中所有内容拷贝到你的程序中。通过include头文件,你可以获得很多编译器提供的函数入口。
无论你什么时候需要使用基本的函数,我们必须包含提供函数入口的头文件。就目前说,我们需要的大部分函数都在iostream头文件中,几乎在每个程序的开头都会看到它,但是你写的大部分程序会有一个或者更多了include语句。
紧接着include语言是下一行:
using namespace std;
这是所有C++代码都包含的代码模板。就目前的程序来说,在程序的上面使用它,正好在include语句的下方。这个语句,让使用较短的程序(iostream头文件提供的)版本变的容易。我们将在以后详细讨论它,现在先忘掉它。
注意这一行是以分号结束的。这个分号是C++句法的一部分。它告诉C++编译器你在语句的最后位置。这个分号用于结束大部分C++语句。不放分号是初学者最容易犯的错误之一,所以如果你的程序因为一些原因不能运行,请确保你没有遗漏分号。每当我介绍新的概念时,我都会告诉你,当你使用他们时是否需要添加分号。
下面是main函数,函数开始的地方:
int main( )
下面一句可能看起来比较奇怪,有一个有趣的<<符号。
cout << "HEY, you, I'm alive! Oh, and Hello World!\n";
C++使用cout对象(发音C out)显示文本。我们包含iostream头文件就是了获取cout对象接口。
它使用<<符号,被成为插入运算符,指示着将要输出什么。简而言之,cout<<触发了函数调用,它使用字符串作为参数传递给函数。函数调用运行与其功能相关的代码。函数在运行代码时通常需要参数。在这个例子中,我们提供的字符串就是一个参数。你可以认为函数参数就像传递给一个等式的参数。如果你想求正方形的面积,你有一个公式是用长乘以宽,那么长宽就是这个公式的参数。函数像公式一样使用变量作为参数。在这个例子中,函数的功能是把输入的参数输出到屏幕上。
引号告诉编译器,你要输出字符串原样,除了一些特殊的序列。\n是这些特殊序列之一--它经常被看成代表换行的单个字符,就像点击了回车键(我们会在以后更详细的讨论)。它使你屏幕上的游标移到下一行。你有时会看到一些特殊的值endl来代替换行:cout << "Hello" <<endl;和cout << "Hello\n"在本质上是相等的。
最后,再一次提醒你注意引号;因为我们调用了函数,所以我们要加上引号。
最后的大括号结束了整个函数。你应该试着编译和链接这个程序。尝试把这段程序写入你的编辑器,或者打开一个随书附带的源文件。你可以复制粘贴它,但是我建议你最好自己敲入代码--它并不长,它会让你注意到更多和编辑器相关的小细节,比如记住使用分号。
既然你已经让程序运行了,为什么不试着使用cout函数来实现更多C++程序呢?输出不同的文本,输入不同的行--看看你能让你的电脑干什么。
如果你看不到程序运行的结果,那该怎么办呢?
运行书中的程序,它依赖于操作系统和你使用的编译器,你也许看不到输出的结果--有可能是一闪而过。如果你使用书中推荐的环境,有可能不会遇到这个问题,但是如果你使用另外一个环境,那么可能发生。如果它出现了,你可以通过加一行代码来修正这个问题:
cin.get( );
在你的程序最后,会等待输入一个按键来结束程序,所以你会在窗口关闭之前看到结果。
基本的C++程序结构
这么短的代码竟然有惊人的数量,让我们去掉所有的细节,看一下基本C++程序的轮廓:
[include statements]
using namespace std;
int main()
{
[your code here];
}
如果你遗漏了上面的一部分内容,会出现什么情况?
如果你遗漏了include语句或者using namespace std,你的程序将编译失败。如果你的程序编译失败,这就意味着有一些编译器不能识别的内容--也许你有语法错误(像确实分号)或者你遗漏了头文件。当你初学编程时,编译错误可能很难找到。一个编译错误很可能导致一个或者更多的错误,这些说明了编译失败的原因。下面是一个常见的编译错误信息:
error: 'cout' was not declared in this scope
当你看到这样的信息,确保你在程序的最上方既包含了#include <iostream>语句和using namespace std;!
编译错误不是那么容易找到。如果你遗漏了分号,你可能会得到很多编译错误提示--通常这些错误正好在你忘掉分号那一行。如果你看到了一些令人费解的编译错误,试着看看它前面的行,确保每一行都有分号。不用担心,随着时间的推移,你会善长于找到编译错误,并且看到更少的编译错误。刚开始看到这些编译错误不要感觉难受,学着去解决这些错误是一个成熟程序员的标志。
注释你的程序
当你学编程的时候,也应该学习为你的程序写文档(如果没有别人看,那就是为你自己看)。通过增加注释到代码中来实现它;更多时候,我用这些频繁的使用注释来解释程序。
当你告诉一段代码是注释时,它会在运行程序时忽略这段代码,这样就允许你使用任何文字来描述真实的代码。为了创建注释,可以使用//,它告诉编译器这一行其他的部分是注释,或者/*然后*/,其间所有的代码都是注释。
// this is a one line comment
This code is not part of the comment
/* this is a multi-line comment
This line is part of the comment
*/
有一些编译环境改变注释区域的颜色,清晰地告诉我们这里不是执行的代码。这是一个语法高亮起作用的实例。
当你学习编程时,注释一些代码片段是很有必要的,可以让我们看到输出的结果是如何被它影响的。注释代码意味着,在你不想编译的代码行上打上注释符号。例如,你不想看到cout语句产生的功能,你可以注释它:
#include <iostream>
using namespace std;
int main ()
{
// cout << "HEY, you, I'm alive! Oh, and Hello World!\n";
}
Sample Code 4:hello_comment.cpp
注意不要注释你需要的代码!
如果你注释掉了一些需要的代码,例如你注释掉了头文件,程序就不会被正确的编译。如果你在编译一段代码时发生错误,你可以试着注释部分你认为没有意义的代码;如果没有这些代码,程序编译通过,那么程序的问题就来源于刚刚注释的代码。
像编程者一样思考,编写可重用的代码
让我们脱离编程语法,来讨论一会编程经验。过去有一家洗车公司,把还有肥皂水的汽车归还给顾客。洗车公司洗了汽车,但是他们没有冲汽车。在这个商业案例中,关键点是保险公司会写很多政策使申请索赔很困难,因为他们已经排除了一些看上去应该索赔的条目。
这个商业案例和你在编程中应该怎样思考有异曲同工之妙。电脑,像洗车公司一样是静态的。他们只精确地执行你让他们做的;他们不懂隐式的含义。如果你说洗车,他们就洗车。如果你想冲汽车,最好也一起说了。刚开始被要求的精细程度是很高的,因为他们需要通过过程的每一步进行思考,确保没有落下每个步骤。
幸运的是,当你编程的时候,一点你告诉计算机怎么样做事情,你可以命名,并指定它而不是一步又一步的重复。所以它不想听上去那么乏味--你不用一遍又一遍的重复,你可以非常精确的指令,在以后重用它。当我们讲到函数时,你会立刻明白。
实践的苦与乐
你刚开始读本书,在本章的结尾会有一些实践的题目。从我的经历看来,学习编程没有比做一些实践的题目更好的方式了。首先,编程需要对细节很注意,很容易阅读完一段文字,并认为“这就是全部内容了”只能说明你没有了解细节。如果你不动手写代码,你不能善长于C++和语言细微的差别。由于刚开始学习编程,不容易想到一些典型的问题,本书大部分章节都包含让你去实践的练习题。没有很多数量,我强烈建议你在阅读下一章之前,尝试去做练习题。
祝贺你!你已经学习了你的第一个程序,并且知道了一点怎么样像编程者一样思考--这里有很多例子,你可以自由使用示例代码来玩玩看你能做些什么。下一章中,我们将学习如何与用户交互,包括如何把用户的输入录入你的程序中。