C++探索之旅 | 第一部分第三课:你的第一个C++程序

做者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。 转载请注明出处。 原文:www.jianshu.com/p/d44bd24ce…html


《C++探索之旅》全系列前端

内容简介


  1. 前言
  2. 命令行的奇幻世界
  3. 建立第一个项目
  4. 解释第一个项目
  5. 注释及代码整洁之道
  6. 总结
  7. 第一部分第四课预告

1. 前言


上一课是 C++探索之旅 | 第一部分第二课:C++编程的必要软件ios

通过上两课以后,咱们已经知道了什么是编程,编程的语言,编程的必要软件,C++ 是什么。git

咱们也安装了适合本身的 IDE(Integrated Development Environment,就是“集成开发环境”的意思)。程序员

除了使用 IDE 以外(IDE 集成了文本编辑器,编译器,调试器,运行程序,等),也能够选择另外一种难一些的方式:本身用某一种文本编辑器来编写 C++ 代码,用 g++(GNU 项目的 C++ 的编译器)来编译程序,而后用命令行来运行程序。github

推荐几个不错的文本编辑器:Vim,Emacs,Sublime Text,Atom,VS Code(如今 VS Code 很是火,经过安装各类插件能够成为 IDE),等。面试

以上几个文本编辑器,我都用过。Sublime 只用了一会,Vim 和 Emacs 用得比较多,Atom 也不错,微软出的 VS Code 也挺好的。正则表达式

我之前写了一篇专门介绍 Emacs 的文章, Emacs,最强编辑器,没有之一 。固然,这个标题有点夸张了,哈哈。其实我如今工做中仍是用 Vim 比较多。编程

这一课咱们就来介绍命令行程序,用 IDE 或 文本编辑器编写第一个 C++ 程序,以及讲解 C++ 程序的基本原理吧。windows

2. 命令行的奇幻世界


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

咱们会一一解释。

也许提及编写第一个程序,你们会很激动,期待干一番大事业。

可是,遗憾的是,咱们这一课可不会带你们开始编写《星际争霸》这样的游戏(固然个人实力也远远够不上... 那须要一个专业团队耗费不少年才能完成),也不会来写一个浏览器,或者视频播放器,等等。

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

首先,咱们来讲一说什么是命令行程序。

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

图形界面程序


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

有过 Windows 使用经验的朋友确定对这样的程序不陌生,由于就连微软的 Windows 操做系统的 "Windows"(window 是英语“窗、窗户”的意思,windows 是 window 的复数)这个英语单词的意思就是“视窗”,Windows 操做系统其实应该翻成“视窗操做系统”。

因此咱们平时也就是在操做形形色色的“窗口”,好比 Chrome 浏览器,火狐浏览器,QQ,微信,迅雷,视频播放器,等等。想想,是否是这些程序都有一个“窗口”做为最外边的框架?咱们能够打开窗口,关闭窗口,调节窗口大小,操做窗口内部的按钮,等等。

这样的程序,专业术语叫作 GUI 程序。GUI 是 Graphic User Interface 的首字母缩略词,表示“图形用户界面”。

例以下图中,咱们能够看到咱们所熟知的 Office Word 软件:

命令行程序


注意:真正的命令行界面应该是彻底没有图形的,就是一个只能输入命令,并且一般是黑色背景,白色字体的“大黑洞”。 咱们如下举例的时候所说的命令行程序,其实大可能是在图形界面内建立一个窗口,此窗口内就像是命令行界面的屏幕同样,一般称为“终端”(Terminal)。

在 Unix 或者 Linux 系统下(能够看个人另外一个系列教程 Linux探索之旅 ),命令行程序相对 Windows 和 macOS 来讲用得更多一些。

Windows 里面也有命令行程序,就是你们可能使用过的 cmd.exe 程序(在 Windows 下按 【Windows 键(键盘左下角有微软图标的按键)+ 字母键 R 】, 而后输入 cmd,回车,就能够调出),它实际上是微软 的 Windows 系统基于 Windows 上的命令解释程序,相似于微软的 DOS 操做系统。以下图:

Windows 下 cmd 程序

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

macOS 下终端

看了 Windows 和 macOS 下的命令行程序,再来看一下咱们 Linux(用 Ubuntu 这个 Linux 发行版来作例子)的命令行程序:

Linux 下终端

虽然说终端或者命令行界面看起来比图形界面“难看”,你们会说“土啊”... 毕竟这年头,你们都喜欢“高颜值”的图形界面程序么。

可是不可讳言,命令行程序是有其独到的优点的。若是命令行没点绝活,哪能受到咱们程序员的青睐。

命令行有以下优点:

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

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

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

  4. 安全性高:可减小因错误操做或者权限问题致使的风险。

不少程序员要的就是这个 feel,倍儿爽~

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

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


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

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

固然了,以后的课程咱们能够在学习完了 C++ 的基本知识点后,用 Qt 这个 C++ 库来编写图形界面的程序,会有不少好玩的程序等待咱们去实现。

不过你们也不要怕,咱们并不须要通过坚苦卓绝的“八年抗战”才可以资格编写图形界面的程序。

好了,说了这么多“废话”,咱们能够正式开始 C++ 编程了。

3. 建立第一个项目


在上一课中,咱们介绍了几个主流 的 C/C++ 编程 IDE :CLion,CodeBlocks,Visual Studio,Xcode,Eclipse,VS Code(虽然是代码编辑器,可是能够经过安装插件成为轻量级的 IDE)。

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

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


Visual Studio 建立 C++ 项目

我是用 Visual Studio 2012 来演示。其余版本的 VS,可能菜单的命名或某些选项窗口会不同,但基本操做应该是相似的。

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

或者(比较提倡这种方法,由于不必定每次建立新项目都是刚打开 VS 时)选择 “文件 -> 新建 -> 项目” :

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

选择默认的 Visual C++ 的 Win32 控制台程序就行了,项目名字能够不改,不过我这里改为了 HelloWorld。点击“肯定”,能够看到下图:

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

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

能够看到咱们的主要的文件:HelloWorld.cpp。

Windows 生成的 main 函数名字和通常的不太同样,叫 _tmain。反正和咱们平时的 main 函数是相似的。

咱们添加咱们须要的代码,以后完整的代码是这样:

// 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):

稍等片刻,VS 的下方会显示:

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

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

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

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

命令行建立 C++ 项目


看过了用 IDE 来建立 C++ 程序的实例,咱们来学习一下对于初学者,特别是没接触过 Linux(一个操做系统,如今主流的操做系统有 Windows,macOS 和 Linux)命令行的朋友来讲比较复杂的方式。若是你彻底没有 Linux 或 Unix 基础,能够跳过此节,就用 IDE 也行。固然你也能够经过搜索一些知识来完成这一节。

首先,把以前的主要程序用文本编辑器(随便你用那个文本编辑器,Nano,Gedit,Vim,Emacs,Sublime Text,Atom,VS Code,等)编写,而后保存为 HelloWorld.cpp 这个文件。

#include <iostream>

using namespace std;

int main() {
   cout << "Hello world!" << endl;
   return 0;
}
复制代码

而后,咱们在 Linux 系统下启动终端(Terminal),通常能够在“应用->附件->终端”,点击启动。

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

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

  1. 安装 g++ 编译器(用于编译 C++ 程序):
sudo apt-get install g++
复制代码

安装 g++ 编译器

  1. 进入 HelloWorld.cpp 这个文件所在的目录:
cd "HelloWorld.cpp 这个文件所在的路径"
复制代码

个人 HelloWorld.cpp 文件就存放在家目录下,因此直接用 cd ~cd 命令就能够。

  1. 编译程序:
g++ HelloWorld.cpp -o HelloWorld
复制代码

上面的 -o 参数里的 o 是 output(英语“输出”的意思)的缩写,就是说“用 g++ 编译 HelloWorld.cpp 这个 C++ 文件,生成的可执行程序名字是 HelloWorld”。

  1. 运行程序:
./HelloWorld
复制代码

编译并运行第一个C++程序

若是你在第 3 步编译的时候不用 -o 参数来指定生成的可执行程序名字,g++ 会为你设置一个默认的名字,可能会叫 a.out。以下图所示:

不用 -o 参数生成 a.out 可执行程序

4. 解释第一个项目


虽然咱们建立了一个项目,可是这个项目很简单,只有一个主要文件,就是 HelloWorld.cpp,它的主要内容以下:

#include <iostream>

using namespace std;

int main() {
    cout << "Hello World!" << endl;
    return 0;
}
复制代码

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

因此咱们才要一块儿来学习如何阅读这段代码。

先从第一行开始吧:

#include <iostream>
复制代码

这一行很特别,咱们会在源代码开头的地方见到这样的以 # 号开头的语句。像这样特别的行,称为“预编译指令”。

这个术语听起来有点复杂。预编译指令会在编译开始的时候,被一种叫作“预编译器”的程序所读取。

其实编译器为咱们作不少事情,以后的课程会详细来讲明。

可是这一行究竟是什么意思呢?

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

iostream 是英语 Input Output Stream(输入输出流)的简称。一般,电脑的输入流是键盘和鼠标,输出流是屏幕。

因此 iostream 这个标准库头文件里面就定义了操做输入输出流相关的全部函数等。

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

#include <Qt>
复制代码

固然了,咱们每次能够 include 好多个头文件。

命名空间:namespace


接着咱们看到第二句话:

using namespace std;
复制代码

这又是什么呢?

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

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

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

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

using 是英语“使用”的意思,因此这句话的意思就是“使用 std 命名空间的东西”。

std 这个命名空间是很经常使用的,由于它指明了“标准命名空间”(std 是 standard 的缩写,表示“标准”)。咱们的 iostream 就是属于 std 命名空间的。

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

int main() {
    cout << "Hello World!" << endl;
    return 0;
}
复制代码

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

咱们如今还不会讲不少函数的细节,由于那是之后【函数】那一课的内容,如今还早。可是咱们会大致说一下函数的组成。

第一行包含了函数的名字,是第二个单词:main。main 表示“主要的”,因此这里的函数被称为 main 函数,也就是主函数。main 函数是一个特殊的函数,C++ 的程序执行老是从 main 函数开始。

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

cout << "Hello World!" << endl;
return 0;
复制代码

这些在函数里的行也有名字,被称为“指令”(instruction)。每一条指令都会让电脑作特定的事情。一个函数大致来讲是用来集中必定数目的指令。好比咱们能够建立一个函数叫作“打开文件”,这个函数会让电脑为你打开某个文件。

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

函数能够大大节约代码空间,增长利用率,提升效率。

这一行指令

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 命名空间中,如今你知道

#include <stdio.h>

using namespace std;
复制代码

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

假如你没加

using namespace std;
复制代码

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

#include <iostream>

int main() {
    std::cout << "Hello World!" << endl;
    return 0;
}
复制代码

而第二个指令

return 0;
复制代码

大致上说来就是表示函数结束了,而且返回 0 值。return 是英语“返回”的意思。

为何咱们的 main 函数返回 0,而不是返回其余值呢?

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

这里咱们只是简单介绍了函数的概念,关于函数的细节请看以后的课程。

5. 注释及代码整洁之道


在结束这一课前,咱们必须再来说一下注释(comment)。不论什么编程语言,咱们均可以在源代码里添加注释。C++ 语言固然不例外。

注释,究竟是什么啊 ?

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

注释有以下做用:

  • 在以后阅读本身写的代码时不至于迷失方向。不能否认,在从新阅读以前写的代码时,咱们经常会忘记这个函数是干什么的,那个地方为何要这样写。特别是代码量很大,几千几万行甚至更多时,若是没有注释,那阅读起来会很费力。

  • 若是你把你的代码给别人阅读,注释能够节省对方理解你的代码的时间。

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

  • 若是你的注释比较短,在一行里就能写完,那能够用 //... 这样的形式。

  • 若是你的注释跨越好几行,那能够用 /* ... */ 的形式。

咱们能够对以前的代码添加注释,变成以下:

#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!

#include <iostream>
using namespace std; int main()
{
cout << "Hello world!"<< endl; return 0; }
复制代码

由于编译器并不介意你的程序是否是“规范”。

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

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

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

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

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

其实我我的更喜欢直接参考 Google 公司的 C++ 代码规范:google.github.io/styleguide/…

6. 总结


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

  2. 刚开始学编程,实现命令行程序更简单。因此咱们从命令行程序开始学习。

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

  4. cout 能够在屏幕上显示信息。

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

7. 第一部分第四课预告


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

下一课咱们学习:C++探索之旅 | 第一部分第四课:内存,变量和引用


我是 谢恩铭,公众号「程序员联盟」(微信号:coderhub)运营者,慕课网精英讲师 Oscar 老师,终生学习者。 热爱生活,喜欢游泳,略懂烹饪。 人生格言:“向着标杆直跑”

相关文章
相关标签/搜索