内容简介

1、第一部分第三课:第一个C++程序

2、第一部分第四课预告:内存的使用


第一个C++程序

经过上两课之后,我们已经知道了什么是编程,编程的语言,编程的必要软件,C++是什么,我们也安装了适合自己的一个IDE(Integrated Development Environment,就是“集成开发环境”的意思)。

如果你真的要开始在Linux下编写程序,除了使用IDE之外(IDE集成了文本编辑器,编译器,调试器,运行程序等),也可以选择另一种难一些的方式:自己用某一种文本编辑器来编写C++代码,用g++(C++的编译器)来编译程序,然后用命令行来运行程序。

推荐几个不错的文本编辑器:Vim,Emacs,Sublime Text,等。

以上三个文本编辑器,小编都用过,Sublime Text只用了一会,Vim和Emacs用得比较多。目前最喜欢的是Emacs,这并不是说其他两个不强大,各有所爱嘛。

小编也写了一篇专门介绍Emacs的文章:

http://blog.csdn.net/frogoscar/article/details/46354789

这一课我们就来介绍命令行程序,编写第一个C++程序,以及讲解C++程序的基本原理吧。


命令行的奇幻世界

这个标题是不是有点玄乎:命令行还有奇幻可言?什么是命令行?

我们会一一解释。

也许说起编写第一个程序,大家会很激动,期待干一番大事业。但是,遗憾的是,我们这一课可不会带大家开始编写《星际争霸》这样的游戏(当然小编的实力也远远够不上... 那需要一个专业团队耗费很多年),也不会来写一个浏览器,或者视频播放器,等。

我们会“慢条斯理”地前进,因为我们要做到的是“踏实”,因为即使是编写《星际争霸》的暴雪团队中的编程精英,也是从最基础的编程知识学起的。

首先,我们说一说什么是命令行程序。

我们需要知道,有两种类型的程序:命令行程序图形界面程序

图形界面程序

简单来说,图形界面程序就是“显示窗口的程序”。

有过Windows使用经验的朋友肯定对这样的程序不陌生,因为就连微软的Windows操作系统的“Windows”这个英语单词的意思就是“视窗”,Windows操作系统其实应该翻成“视窗操作系统”。

所以我们平时也就是在操作形形***的“窗口”,比如chrome浏览器,火狐浏览器,QQ,迅雷,暴风影音播放器,大家想想,是不是这些程序都有一个“窗口”作为最外边的框架?我们可以打开窗口,关闭窗口,调节窗口大小,操作窗口内部的按钮,等等。

这样的程序,专业术语叫做“GUI”程序,GUI是Graphic User Interface的首字母缩略词,也就是“图形用户界面”的意思。例如下图中,我们可以看到我们所熟知的Office Word软件:

小编是在Mac下的Office软件,可能和大家平时看到的有些不太一样。

命令行程序

注意:真正的命令行界面应该是完全没有图形的,就是一个只能输入命令的通常是黑色背景,白色字体的“大黑洞”。

我们以下举例的时候所说的命令行程序,其实大多是在图形界面内创建一个窗口,此窗口内就像是命令行界面的屏幕一样,通常称为“终端”(Terminal)。

在Unix或者Linux系统下(可以去看小编的另一个系列课程【Linux探索之旅】,连载中),命令行程序相对Windows和Mac来说用得更多一些。

Windows里面也有命令行程序,就是大家可能使用过的cmd.exe程序(在Windows下按 Windows键(那个左下角有微软图标的)+ r, 然后输入 cmd,回车,就可以调出),它其实是微软Windows系统基于Windows上的命令解释程序,类似于微软的DOS操作系统。如下图:

Mac OS里也有Unix范式的命令行解释器:

看了Windows和Mac下的命令行程序,再来看一下我们Linux的命令行程序:

虽说终端或者命令行界面看起来比图形界面“难看”,大家会说“土啊”。。。

但是不可讳言,命令行程序是有其独到的优势的。毕竟这年头,大家都喜欢“高颜值”的图形界面程序么。如果命令行没点绝活,哪能受到我们程序员的青睐。命令行有如下优势:

  1. 可实现图形界面不具有的功能:Linux的很多程序是面向命令行的,没有图形前端,只能用命令行使用。

  2. 可使用超级用户权限:一些需要超级用户权限的操作只能在命令行下运行。

  3. 高效快速:可借助正则表达式实现批量处理,还能向程序发送参数。

  4. 安全性高:可减少因错误操作或者权限问题导致的风险。但是我觉得如果你在Linux下执行如下命令:sudo rm -rf /  那携程也是可能又要醉一次了。

很多程序员要的就是这个feel,倍爽~

命令行程序中,我们只能使用键盘输入命令,鼠标一般是没什么作为的。文字信息是按从上到下,从左到右的顺序显示。

我们的首期目标:命令行程序

我们将从命令行程序开始,一点点学习C++的各样知识点。

我知道,虽然扫了在座的兴致,命令行界面颜值不够高,但是却相对图形界面容易创建,特别对于初学编程的朋友来说。

当然了,我向大家保证,之后的课程我们会在学习完了C++的基本知识点后,用Qt这个C++库来编写图形界面的程序,会有很多好玩的程序等待我们去实现噢。

这就好比,如果中国共*产*党没有经过农村包围城市,从基层(命令行程序)做起的话,又怎么能有后来恢宏的开国大典(图形界面程序)上毛*主*席的慷慨陈词呢?

不过大家也不要怕,我们并不需要经过艰苦卓绝的“八年抗战”才能够资格编写图形界面的程序。

好了,说了这么多废话,我们可以正式开始C++编程了。


创建第一个项目

 

在上一课《【C++探索之旅】:C++编程的必要软件》中,我们演示了三个主流C/C++编程的IDE :

  • CodeBlocks (跨平台,Linux,Windows,Mac都可以)

  • Visual Studio (简称VS,只能运行在Windows系统里)

  • XCode (只能运行在Mac系统里)

上一课里我们演示了如何用CodeBlocks和XCode创建一个C++项目,没有演示如何用VS创建C++项目,那么这一课就来演示如何在Visual Studio中创建第一个C++项目,并编译运行。

之后再演示不使用IDE,而纯使用g++命令(对于Linux下的用户来说,最好使用这个方式,比用IDE可以学到更多东西)来编译,并用命令行来运行。

 

Visual Studio创建C++项目

小编会在我的旧电脑的Win7系统下,用Visual Studio 2012来演示。其他版本的VS,基本操作应该是一样的。

首先,新建一个项目,有两种方法,你可以在初始打开VS时,点击如下图中的“新建项目”:

或者(比较提倡这种方法,因为不一定每次创建新项目都是刚打开VS时)选择  文件->新建->项目 :

用以上两种方式,都可以调出以下窗口:

选择默认的Visual C++的Win32控制台程序就好了,项目名字可以不改,不过我这里改成了HelloWorld。点击“确定”,可以看到下图:

点击“下一步”,出现下图:

不需要修改,默认配置就好,点击“完成”。我们的项目就创建好了:

可以看到我们的主要的文件:HelloWorld.cpp

Windows搞出来的main函数都不一样,叫什么 _tmain。反正和我们平时的main函数是类似的。

我们添加我们需要的代码,之后完整的代码是这样:

  1. // HelloWorld.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){   // 在屏幕上显示"Hello World!"   cout<<"Hello World!"<<endl;   return 0;}

至此,我们的主要程序就写好了。我们来编译运行吧。

首先,编译代码。点击 生成->生成解决方案 (也可以按快捷键 F7):

显示“生成:成功”,则表示我们的程序编译成功了。

接下来运行程序,点击 调试->开始执行(不调试)(也可以按Ctrl + F5):

程序运行的结果是输出“Hello World!”,如下图:

通过简单的几个步骤、短短的几行代码,就创建了我们的第一个C++程序,并实现了"Hello World!"输出。用C++编程就这么简单!

命令行创建C++项目

看过了我们用IDE来创建C++程序的实例,我们来学习一下对初学者,特别是没接触过Linux(一个操作系统,现在主流的操作系统有Windows,Mac OS和Linux)命令行的朋友来说比较复杂的方式。如果您完全没有Linux或Unix基础,可以跳过此节,就用IDE也行。当然你也可以通过百度一些知识来完成这一节。

首先,把之前的主要程序用文本编辑器(随便你用那个文本编辑器,nano,gedit,Vim,Emacs,Sublime Text,等)编写,然后保存为 HelloWorld.cpp这个文件。

  1. #include <iostream>using namespace std;int main(){   cout << "Hello world!" << endl;   return 0;}

然后,我们在Linux系统下启动终端(Terminal),一般可以在 应用->附件->终端,点击启动。

或者像Ubuntu这样的Linux发行版,可以同时按 Ctrl + Alt + t 这三个键来快捷启动终端,终端是长这个样子的:

下面演示的命令,是在Ubuntu系统下执行的:

  1. 安装g++编译器:

    sudo apt-get install g++

  2. 进入HelloWorld.cpp这个文件所在的目录:

    cd "HelloWorld.cpp所在的路径"   (小编的HelloWorld.cpp这个文件就存放在家目录下,所以直接  cd ~  就可以)

  3. 编译程序:

    g++ HelloWorld.cpp -o HelloWorld

  4. 运行程序:

    ./HelloWorld


解释第一个项目

虽然我们创建了一个项目,但是这个项目很简单,只有一个主要文件,就是HelloWorld.cpp,它的主要内容如下:

  1. #include <iostream>using namespace std;int main(){   cout << "Hello World!" << endl;   return 0;}

对于第一次接触编程的朋友,可能这个最基础的代码也是难以理解。

所以我们才要一起来学习如何阅读这段代码。

先从第一行开始吧:

  1. #include <iostream>

这一行很特别,我们会在源代码开头的地方见到这样的以#号开头的语句。像这样特别的行,称为“预编译指令”。这个术语听起来有点复杂。预编译指令会在编译开始的时候,被一种叫做“预编译器”的程序所读取。

其实编译器为我们做很多事情,我们之后的课程会详细来说明。

但是这一行到底是什么意思呢?

这里的#号是预编译指令开始的标志,没有什么特别的含义,后面接着的 include 是英语“包含”的意思,所以这句话的意思就是在我们的程序里包含 iostream 这个文件,这个文件在C++的系统的库里已经存在了,这些文件被称为 库文件 

iostream是英语“Input Output Stream”(输入输出流)的简称。通常,电脑的输入流是键盘和鼠标,输出流是屏幕。所以iostream这个标注库头文件里面就定义了操作输入输出流相关的所有函数等。

之后的课程,当我们要编写图形界面程序时,我们会使用Qt这个C++的第三方库。而我们会在程序里引入Qt这个头文件的内容,如下:

  1. #include <Qt>

当然了,我们每次可以include好多个头文件。

命名空间:namespace

接着我们看到第二句话:

  1. using namespace std;

这又是什么呢?

我们来介绍一下命名空间(namespace)的概念:

命名空间告诉编译器去哪里找我们所调用的东西。

听着有点晕?命名空间有什么用呢?

例如,你用#include 语句引入了好多个库,而这些库里有的函数是重名的。比如在iostream中我们定义了DoSomething这个函数,而在Qt这个第三方库中也定义了相同名字的函数,也叫DoSomething,那编译器就不知道用哪个里面所定义的DoSomething函数了。

using是英语“使用”的意思,所以这句话的意思就是“使用std命名空间的东西”,std这个命名空间是很常用的,因为它指明了 标准命名空间(std是英语“标准”(standard)的简写)。我们的iostream就属于std命名空间的。

接着,我们看到了下面的语句:

  1. int main(){   cout << "Hello World!" << endl;   return 0;}

以上我们所看到的语句块,被称为函数。其实C++语言的程序基本就是由函数来构成的。目前我们的程序只有一个函数。

我们现在还不会讲很多函数的细节,因为那是后面的【函数】那一课的内容,现在还早。但是我们会大体说一下函数的组成。

第一行包含了函数的名字,是第二个单词:main。所以这里的函数称为main函数。这是一个特殊的函数,程序执行总是从main函数开始。

一个函数有开始和结束,使用大括号 {} 来标识。所以我们的main函数包含以下两行代码

  1. cout << "Hello World!" << endl;return 0;

这些在函数里的行也有名字,被称为“指令”。每一条指令都会让电脑做特定的事情。一个函数大体来说是用来集中一定数目的指令。比如我们可以创建一个函数叫做“打开文件”,这个函数会让电脑为你打开某个文件。

函数的优势就是当你写好了这个函数之后,你只需要使用(专业术语叫做 “调用”)“打开文件”这个函数,电脑就会为你执行函数里面的指令。你不需要每次在要实现“打开文件”功能的地方都重复写那些指令。

函数可以大大节约代码空间,增加利用率,提高效率。

这一行指令

  1. cout << "Hello World!" << endl;

使得屏幕显示“Hello World!”这一句话。

它由三部分组成:

  1. cout:在标准输出(此处是屏幕)上显示信息

  2. "Hello World!":要显示的内容

  3. endl:表示换行

当你的程序执行到这一行时,就在屏幕上显示相应的信息,然后换行。

cout有点类似C语言的printf函数,是C++里面负责标准输出的。不过又有不同,我们可以看到cout后面不是加括号,而是连接了<<这个特殊的符号。

暂时我们不深入,因为cout其实不是一个函数,cout是一个ostream类的对象(关于类和对象,之后的课程会讲解),它有一个成员运算符函数operator<<  (涉及到C++的运算符重载的技术,以后会讲)。(这一句指令暂时不需要理解,只要知道这句话的作用)。

cout的定义是在 iostream 库的std命名空间中,现在你知道

  1. #include <stdio.h>using namespace std;

这两句话的重要性了吧?如果没有引入 iostream 这个库并且不指明使用哪个命名空间的话,那我们的main函数就不能调用std的cout。

假如你没加

  1. using namespace std;

这一句话,那么调用cout时须要加上 std:: 这样的:

  1. #include <iostream>int main(){   std::cout << "Hello World!" << endl;   return 0;}

第二个指令

  1. return 0;

大体上说来就是表示函数结束了,并且返回0值。

为什么我的函数返回0,而不是返回其他值呢?

实际上,每个C++语言程序结束时都会返回一个值,0表示一切正常结束,其他的值表示异常。

这里我们只是简单介绍了函数的概念。细节请期待之后的课程。


注释及代码整洁之道

在结束这一课前,我们必须再来讲一下 注释。不论什么编程语言,我们都可以在源代码里添加注释。C++语言当然不例外。

注释,到底是什么啊?

简单地说,注释就是在你程序之中用来标注这个程序的作用,某一行代码的作用等等的文字。注释真的很重要,因为即使是一个计算机天才,也要在这儿那儿做一些注解。

注释有如下作用:

  • 在之后阅读自己写的代码时不至于迷失方向。不可否认,在重新阅读之前写的代码时,我们常常会忘记这个函数是干什么的,那个地方为什么要这样写。特别是代码量很大,几千几万行甚至更多时,如果没有注释,那阅读起来会很费力。

  • 如果你把你的代码给别人阅读,这可以节省对方理解你的代码的时间

要在代码中插入注释,有几种形式:

  • 如果你的注释比较短,在一行里就能写完,那可以用  //...  这样的形式

  • 如果你的注释跨越好几行,那可以用  /* ... */  的形式

我们对之前的代码添加注释,变成如下:

  1. #include <iostream>     // 引入 iostream 这个库 (为了使用cout)using namespace std;  // 指明要使用的命名空间/*主函数 main所有的C++程序都从main函数开始*/int main() {   cout << "Hello, World!\n" << endl; // 在屏幕上显示"Hello, World!",并且换行   return 0;                  // 结束main函数,也就是结束程序}

可以看到,虽然程序行数变多了,但是注释却使我们的代码变得易读很多。

编译代码的时候,编译器会忽略所有的注释。这些注释不会出现在最终的程序里,只是为程序员自己和阅读程序的其他人服务的。

记住

注释要起到引导阅读代码的作用,以便理清头绪。但是不要在太过浅显易懂的地方添加注释。

引用IBM公司的一句格言:

《如果一个程序,在你仅仅看完它的注释之后,你不能了解它的作用,那么把这个程序扔了吧》

-- 大公司就是这么严格,这么任性。

代码整洁之道

其实我们的程序完全可以写成这样,也是正确的,可以编译运行,输出"Hello World!"

  1. #include <iostream>using namespace std;int main(){       cout<<"Hello world!"<<endl; return 0; }

因为编译器并不介意你的程序是不是“规范”。

但这样的程序问题是什么呢?

“乱七八糟”,可以这么形容。因为这样的程序风格使得别人很不容易阅读你的代码,甚至过了一段时间可能你自己也会摸不着头脑。

如果你去面试,写出这样的程序,那九成是不会被录取的。除非你参加“国际C 语言乱码大赛(IOCCC)”。

所以一开始就养成良好的代码风格是很重要的。

推荐大家去看林锐编写的《高质量C++/C 编程指南》。


总结

  1. 有两种程序:命令行程序和图形界面程序。

  2. 刚开始学编程,实现命令行程序更简单。所以我们从命令行程序开始学习。

  3. 一个C++程序总是有main函数:这是程序运行的入口。

  4. cout可以在屏幕上显示信息。

  5. 我们可以给程序添加注释,以详述其作用。C++中的注释有两种形式:// 注释   或者   /* 注释 */


第一部分第四课预告

今天的课就到这里,一起加油吧!

下一课我们学习:内存的使用


程序员联盟 微信公众号

*您若觉得本文不错,请点击画面右上角《···》按钮分享

*新朋友请关注「程序员联盟」微信搜公众号  ProgrammerLeague

程序员联盟官网:

http://coderunity.com/

小编微信号: frogoscar

小编邮箱:    enmingx@gmail.com

小编QQ号:  379641629

程序员联盟QQ群:413981577

程序员联盟微信群:先加我微信

头条网自媒体“程序员联盟”:

http://www.toutiao.com/m3750422747/

小编的51CTO博客,CSDN博客,博客园,新浪博客和开源中国博客
http://4526621.blog.51cto.com

http://blog.csdn.net/frogoscar

http://www.cnblogs.com/frogoscar

http://blog.sina.com.cn/frogoscar

http://my.oschina.net/frogoscar/blog

【打赏小编】

觉得文章对您有帮助,请纪念小编的辛勤劳动,扫描二维码打赏小编,谢谢!

支付宝

Paypal

【C++探索之旅】第一部分第三课:第一个C++程序的更多相关文章

  1. 【Linux探索之旅】第一部分第三课:测试并安装Ubuntu

    内容简介 1.第一部分第三课:测试并安装Ubuntu 2.第一部分第四课预告:磁盘分区 测试并安装Ubuntu 大家好,经过前两个比较偏理论(是否想起了带着瓜皮帽,手拿折扇的老学究,或者腐儒)的课程, ...

  2. 【Linux探索之旅】第二部分第二课:命令行,世界尽在掌握

    内容简介 1.第二部分第二课:命令行,世界尽在掌握 2.第二部分第三课预告:文件和目录,组织不会亏待你 命令行,世界尽在掌握 今天的标题是不是有点霸气侧漏呢? 读者:“小编,你为什么每次都要起这么非主 ...

  3. 【C语言探索之旅】 第二部分第二课:进击的指针,C语言的王牌!

    内容简介 1.课程大纲 2.第二部分第二课: 进击的指针,C语言的王牌 3.第二部分第三课预告: 数组 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...

  4. 【Web探索之旅】第二部分第二课:服务器语言

    内容简介 1.第二部分第二课:服务器语言 2.第二部分第三课预告:框架和内容管理系统 第二部分第二课:服务器语言 介绍了Web的客户端,我们来谈谈Web的服务器端. 既然客户端有客户端的编程语言(HT ...

  5. “人向猿进阶”之软件工程第三课----WORDCOUNT.EXE统计程序

    ---恢复内容开始--- WC项目要求 这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数.单词数和行数.给实现一个统计程序,它能正确统计程序文件 ...

  6. 第一部分 记事本搞定第一个C#程序和编译过程剖析

    记事本搞定第一个C#程序 进行下面三个步骤:编码,编译和托管运行. 1.记事本进行编码: using System; class Program{ public static void Main() ...

  7. 三、第一个cocos2d程序的代码分析

    http://blog.csdn.net/q199109106q/article/details/8591706 在第一讲中已经新建了第一个cocos2d程序,运行效果如下: 在这讲中我们来分析下里面 ...

  8. Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像

    本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试 ...

  9. 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案

    内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...

随机推荐

  1. VS快捷键教程

    删除或剪切一行(Ctrl + X) 不须要选择不论什么文本, 用来剪切一行, 最经常使用来删除一行.  删除一行也能用 Shift+Delete 格式化整个文档(Ctrl + K, Ctrl + D) ...

  2. HDU 5107 线段树扫描线

    给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...

  3. Android开发 - ActivityLifecycleCallbacks用法初探

    ActivityLifecycleCallbacks是什么? Application通过此接口提供了一套回调方法,用于让开发人员对Activity的生命周期事件进行集中处理. 为什么用Activity ...

  4. Terracotta收购Ehcache (转)

    随着Terracotta对Ehcache的收购成行,业界两大知名的开源Java缓存产品走到了一起.以提供JVM级“POJO集群”而闻名于世的Terracotta可以将运行在单个JVM上的多线程应用移植 ...

  5. Remote Desktop Organizer – 管理组织远程桌面 - 小众软件

    http://www.appinn.com/remote-desktop-organizer/

  6. DB2错误代码

    db2错误代码大全 博客分类: 数据库 sqlcode sqlstate 说明 000 00000 SQL语句成功完毕 01xxx SQL语句成功完毕,可是有警告 +012 01545 未限定的列名被 ...

  7. _00021 尼娜抹微笑伊拉克_谁的的最离奇的异常第二阶段 Jedis pool.returnResource(jedis)

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 博文标题:_00021 妳那伊抹微笑_谁的异常最诡异第二期之 Jedis pool.returnRes ...

  8. linux开机启动服务和chkconfig使用方法(转)

    每个被chkconfig 管理的服务需要在对应的/etc/rc.d/init.d 下的脚本加上两行或者更多行的注释. 第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级.如果某服务 ...

  9. Berkeley DB 使用

    http://www.ibm.com/developerworks/cn/linux/l-embdb/index.html UNIX/LINUX平台下的数据库种类非常多,参考资料1中 列举了其中的大部 ...

  10. 解决eclipse project前出现红色感叹号 但没有提示错误出在什么地方build path jar包也没报错

    在problems窗体能够看到错误信息 菜单条 window-->show view-->problems 或alt+shift+q 然后按x 又一次选一下包就攻克了