基本C++

这个教学系列的目的是针对每个人:即使你以前没有设计过程式或是你在其他的程式语言有相当的经验并且想要扩展到C++!这可以给每一个人想要拥有一个可执行的程式那种成就感。

[adsense][/adsense]

我的意思是什么?C++是一种程式语言—它允许你控制你的电脑,让它做你想要它做的,这个程式语言教学系列会帮你获得C++的好处。

开始设定 – C++ 编译器

在开始了解C++之前,你第一件要做的就是确定你有编译器,什么是编译器,你问?编译器就是将你写的程式转变成你的电脑可以真正了解并执行的执行档,假如你是参加一个课程,你可能会透过你的学校取得一个编译器,假如你是开始自己学,你最好的选择就是使用Code::Blocks,我们在设定Code::Blocks这页将会很详细地带你通过设定Code::Blocks编译器。

进阶编译器资料

如果你有一些以前的经验,或者只是想要一个选择的菜单,你应该知道有一些常用的编译器,假如你是程式设计新手,就跳过这节!
一些常用的编译器包括Borland C++Microsoft C++GNU C++
不同的编译器也有许多前端的环境–最常见的有使用GNU G++ 编译器的Dev-C++,有一些像是G++是免费的,有些则不是,请见编译器列表 有更多关于如何取得编译器及设定的资讯。
这些编译器每一个都有些不同,每一个应该支援ANSI/ISO标准C++函式,但每一个编译器也会有不标准的函式(这些函式类似于一个国家的不同区域的口语或俚语那样),当你用不同编译器试着编译原始码(由程式设计师所写的C++并存为一个文字档)的时候不标准的函式有时候会造成问题,这些使用ANSI/ISO标准C++的教学应该不会有这个问题(有足够现代的编译器),注意假如你使用较旧的编译器,像是TCLite,你应该你应该阅读检查一些相容性问题

进入C++语言

一个C++程式就是一个命令的集合,告诉电脑做”一些事”,这些命令的集合通常称作C++原始码、原始码或只是程式码,命令不是”函式”就是”关键字”,关键字是一个语言基本的建构方块,事实上,函式也是,通常是由简单的函式写成–你会看到我们第一个程式在下面(搞混了吗?你可以把它想成是一本书的大纲;大纲可以看出书里的每一章;每一章也有它自己的大纲,这些是由节组成的。每一节可以有自己的大纲,也有可能是写出的细节),幸运的是,c + +提供了许多你可以使用的常用函式和关键字。
但是一个程式是如何真正地开始?每个C++的程式都会有一个函式,叫做main,它总是在你的程式一开始执行的时候就呼叫,对于main,你也可以呼叫其他的函式,不管他们是我们写出来的,又或是前面提到的是由编译器提供的
所以你如何取得那些预写的函式?要取得那些编译器所拥有的标准函式,你可以含括一个#include的前置指令,这样做可以有效地将每件事放在标头档中然后贴到你的程式中,让我们看看一个正在使用的程式:

#include <iostream>

using namespace std;

int main()
{
  cout<<"HEY, you, I'm alive! Oh, and Hello World!\n";
  cin.get();
}

让我们看看程式的元素,这个#include是一个”前置处理器”指令,告诉编译器在真正建置执行档前从一个叫做iostream的标头档放程式码到我们的程式中,藉着含括标头档,你获得存取许多不同函式的权限,例如,cout函式需要iostream,include之后是叙述”using namespace std;”,这一行告诉编译器使用标准函式库(std)的一部分函式,藉着在档案前面含括这一行,你允许程式使用像是cout的程式,分号是C++语法的一部分,它告诉编译器这是一个命令的结束,你稍后会看到分号被用在C++很多的命令结束部份。

接下来重要的一行是int main(),这一行告诉编译器有一个函式叫做main,这个函式会传回一个整数,因此写int,这个”大括号” ({ 跟 })表示函式跟其他程式区块的开始跟结束,你可以把他们想成是BEGIN跟END的意义。

程式的下一行看起来有点奇怪,假如你有写过其他的程式语言的话,你可能会认为是用来显示字串的print函式,然而在C++里,这个cout物件用来显示文字(念作”C out”),它使用<<符号,就是我们所知的”插入运算子”,表示有什么要输出,cout<<导致随后的文字作为这个函式的参数,引号告诉编译器,你要输出的字串原样,’\n’序号实际上是被视为一个单一的字元,代表着一个新行(我们稍后会有更详细的说明),它移动荧幕上的游标到下一行,再一次注意到分号,它被加在很多行的后面,像是C++的函式呼叫。

下一个命令是cin.get(),这是另一个函式呼叫:它读取输入并且期望使用者按下ENTER键,很多编译器环境会开启一个命令列视窗,执行程式,然后关闭视窗,这个命令会让视窗不会关闭因为程式尚未完成因为它正等着你按下ENTER键,含括这一行会给你时间来看看程式的执行。

在到达main的结尾,结束的括号,我们的程式会传回0的值(而且是整数,这也是为什么我们会告诉main传回一个int)给作业系统。这个传回值是重要的,它可以用来告诉OS我们的程式是否成功,传回0的值表示成功,而且是自动传回(但这有main这样,其他的函式需要你手动传回一个值),但是假如我们想要传回其他的东西,像是1,我们就必须有一个处理return的叙述:

#include <iostream>

using namespace std;

int main()
{
  cout<<"HEY, you, I'm alive! Oh, and Hello World!\n";
  cin.get();

  return 1;
}

最后的括号结束函式,你可以试着编译这程式并且执行它,你可以将程式码剪下贴到档案里,将它存成.cpp档,我们的Code::Blocks教学可以带你建置一个简单的程式,所以如果你搞混了就检查看看。

假如你没有使用Code::Blocks,你应该阅读编译器关于如何编译的资讯说明。

一旦你拿到第一只程式执行,为什么不试着玩一玩cout函式来适应C++的撰写?

在你程式的旁边注解

当你学习程式设计时,你应该也开始要学习如何解释你的程式(如果没有其他人就是为你自己),你可以增加注解到程式码中;我会常常使用注解来帮注解事程式码范例。

当你告诉编译器有一段的文字是注解,它会在执行程式码的时候忽略它,允许你使用任何的文字来描述你真实的程式码,要新增一个注解不是使用 //来告诉编译器这一行之后是一个注解,就是用 /* 然后 */来区隔这之间的文字是一个注解,在某些的编译器环境中会改变注解区域的颜色,但是有些则不会,确定不要意外地将你需要的程式码给注解起来(那就是说,告诉编译器说你的程式码某个部份是注解),当你学习程式设计时,能够将一段程式码注解起来是有用的因为这样可以看出这个输出是怎样。

使用者互动跟使用变数储存资讯

到目前为止你已经学了如何写一个简单的程式来显示程式设计师就是你所输入的资讯,以及如何用注解来描述你的程式,那很棒,但是关于跟你的使用者互动呢?幸运地,也有可能让你的程式来接受输入了,你所要用的函式被称为cin,而且后面会有插入运算子>>。

当然,在你试着接受输入之前,你必须有一个地方可以储存输入,在程式设计里,输入跟资料被储存在变数里,有几个不同的变数型态来储存不同种类的资讯(例如,数值对字母);当你告诉电脑你宣告一个变数,你必须含括资料型态还有变数名称,几个基本的型态包括char、int跟float。

一个char型态的变数储存一个单一字元,int型态的变数储存整数(没有小数点的数值),而float型态的变数储存有小数点的数值,每一个变数型态 – char、int跟float – 是一个你在宣告一个变数时使用的关键字。

所有这些变数型态做什么用?

有时候有这么多种变数型态当它看起来像某些变数型态是多余的时候会令人难以理解的(为什么当你有浮点数时用整数数字),使用正确的变数型态让你的程式码可以阅读跟有效率是很重要的–有些变数需要比其他变数还要多的记忆体,此外。因为数字储存的方式是真正存在记忆体内,浮点数是”不精确的”,而且在你需要储存一个”精确的”整数值不能够使用。

在C++里宣告变数

要宣告变数你要使用语法”type <name>;”,这里有一些变数宣告的范例:

int x;
char letter;
float the_float;

在同一行宣告相同型态的多个变数是允许的;每一个变数应该用逗号分隔。

int a, b, c, d;

假如你注意看,你可能看到宣告一个变数之后会加上分号(注意这跟你呼叫一个函式是相同的程序)。

在C++里宣告变数常见的错误

假如你尝试使用一个未经宣告的变数,你的程式将不能编译或执行,之后你会收到一个错误讯息通知你犯了一个错误,通常,这称作未宣告的变数

大小写区分

现在是时候来讨论一个你很容易丢的一个重要观念,大小写区分,基本上,在C++里,不论你是使用大写或小写字母,这个Cat跟cat两个字的意义对编译器来说是不同的,在C++里,所有的语言关键字,所有的函式和所有的变数都是大小写区分的,在例子里你的变数宣告跟变数的使用不同就是你可能会得到一个没有宣告的变数错误的原因。

使用变数

Ok,所以你现在知道如何告诉编译器变数的事,但是有关于使用他们的事吗

这里有一个范例程式描述变数的使用:

#include <iostream>

using namespace std;

int main()
{
  int thisisanumber;

  cout<<"Please enter a number: ";
  cin>> thisisanumber;
  cin.ignore();
  cout<<"You entered: "<< thisisanumber <<"\n";
  cin.get();
}

让我们掰开这一个程式,并逐行检查,关键字int宣告thisisanumber是一个整数,函式cin>> 读取一个值到thisisanumber;使用者在数植被程式读取前按下enter,cin.ignore() 是另一个读取并抛弃一个字元的函式,记住当你输入到程式的时候,它也会用到enter键,我不需要这个,所以我们要把它丢掉,记住变数被宣告为整数,假如使用者尝试输入一个有小数的数值,它会被截掉(那就是,数值的小数部份会被忽略),当你执行范例程式时试着输入一列的字元或是一个有小数的数字;回应会随着输入的不同而不同,但是在任何情况下都非常地漂亮,注意在印出变数的时候不需要加引号,如果有引号,输出就会是 “You Entered: thisisanumber.”,少了引号通知编译器这是一个变数,因此程式会检查变数值以便在执行输出函式时可以将变数名称取代为变数,不要被一行内用了两个新增运算子而搞混,一行内含括多个新增运算子是可以完全接受的,而且所有的输出会在相同的地方,事实上,你必须用它自己的新增运算子(<<)来分隔几个字串常数(有用引号刮起来的字串)跟变数,试着将两个变数放在一起然后只用一个 << 会有错误讯息给你,不要这样尝试,不要忘记结束函式跟宣告要用分号,假如你忘记分号,在你试着编译程式的时候,编译器会给你一个错误讯息。

感遍及比较变数

当然,不论你使用什么型态,变数不能修改就会无趣,一些变数使用的运算子有下列:*、-、+、/、=、==、>、<,* 乘法、 – 减法跟 + 加法,当然也要了解倒要修改成事里的变数值要使用等号也是相当重要的,在某些语言里面,等号比较左边跟右边的值,但是在C++里面是用 == 来做比较,等号仍然相当有用,变数设置在等号左边,必须有一个而且只有一个变数等于等号右边的值,这个执行数学函式的运算子用在等号右边是为了将结果指定到左边的变数,这里有一些范例:

a = 4 * 6; // (Note use of comments and of semicolon) a is 24
a = a + 5; // a equals the original value of a with five added to it
a == 5     // Does NOT assign five to a. Rather, it checks to see if a equals 5.

另一个等号形式,==,它不是用来指定值给变数,相反地,它检查变数是否相等,它在其它C++的领域里头也很有用;举例来说,你会常使用 == 在条件叙述跟回圈这样的建构式中,你能会猜 < 跟 > 的功能为何,他们是大于跟小于的运算子。

举个例说:

a < 5  // Checks to see if a is less than five
a > 5  // Checks to see if a is greater than five
a == 5 // Checks to see if a equals five, for good measure

比较变数要只到你有使用到结果的时候才会真正有用 –那是第2课的课程if叙述 要讨论的。

你是否可以跟到? 测验一下吧

下一课: If 叙述 – 有条件地改变程式的行为

回到教学的目录