C++复习 第二章 第一节 开始学习C++

目录

2.1 进入C++

        2.1.1 main()函数

        2.1.2 C++注释

        2.1.3 C++预处理器和iostream文件

        2.1.4 头文件名

        2.1.5 名称空间

        2.1.6 使用cout进行C++输出

        控制符endl

        换行符

        2.1.7 C++源代码的格式化

        源代码中的标记和空白

        C++源代码风格


2.1 进入C++

首先介绍一些简单的C++程序。C++使用工具cout来进行字符的输出,偶尔也会提供一些注释,以方便读者阅读理解代码含义,注释以//开头。例如如下程序:

//程序清单2.1
//头文件
#include <iostream>

//函数头,此函数是程序的主函数
int main(void) //int为函数返回值类型,main为函数名称,void表示函数不需要传入参数
{
    //大括号里的是main函数的函数体

    //使用名为std的命名空间
    using namespace std;

    //使用cout来在命令提示窗口中输出Hallo World!
    cout << "Hello World!" << endl;

    //函数返回值
    return 0;
}

其中注释以//开头,编译器会忽略//后的所有内容(仅限一行)。上述代码运行后会弹出命令提示符窗口,窗口中会显示出Hello World!。读者不需要理解其中代码的含义,这会在之后的章节逐一进行介绍。

C++程序对大小写敏感,也就是说C++程序是区分大小写的。如果将上面代码中的cout改为Cout,那么程序将不能运行。另外C++程序也是对拼写敏感,不能将cout拼写为xout或kout等。C++的源文件一般会保存为.cpp格式,这是C++程序的常用方式。

        2.1.1 main()函数

        上面的main()函数可以简化为如下形式:

int main(void)
{
    statements
    rewturn 0;
}

        第一行的“int main(void)”叫做函数头(function heading),大括号{ }中间的内容叫做函数体。函数体中包括了函数执行语句statements和结束函数return 0;

        另外C++的语句后一般会跟一个分号“;”,这个分号是英文输入法中的分号,这点请牢记,部分代码出错的原因就是忘记在行末加分号以结束语句,或者是打成了汉语输入法的分号。这个分号在C++中起到了一个终止符的作用,用来表示一条语句的结束,是语句的组成部分,而不是语句之间的标记。

        int main() 函数头表明可以给调用它的函数返回一个整数值,且不从调用它的函数中获得任何信息。当然括号中可以加入void,变为int main(void)这和int main()是等价的。void关键字指出该main()函数不接受任何参数。某些程序员会使用void main()来省略return 0语句,但是在某些系统中不能工作。如果使用int main()并且没有return 0;编译器会认为main()函数以return 0;结尾,这一条只适用于main()函数,而不适用于其他函数。

        C++程序必须包含一个名为main()的函数(不是Main()、MAIN()或是mane())。

        2.1.2 C++注释

        C++风格注释以双斜杠开头 // 注释是程序员为读者提供的程序说明,通常标识程序的一部分或解释代码的某个方面。编译器会忽略注释,不编译注释中的内容。

        我觉得在编写代码总行数超过100行的函数或者.cpp文件超过500行时,最好为部分代码添加注释,特别是当你有一段时间不接触这段代码的情况下,这种注释的价值会更大。

        C风格注释以 /* 开头,以 */ 结尾。可以跨越多行,将 /* 和 */ 之间的代码部分解释为注释。即 /* 注释内容 */,例如:#include <iostream> /* 我是C风格的注释 */。一般的C++编译器都会支持C和C++两种风格的注释。

        2.1.3 C++预处理器和iostream文件

        如果程序需要使用输入或输出工具,那么需要使用以下两行代码:

#include <iostream>
using namespace std;

         C++和C一样都使用了一个预处理器,在程序进行主编译之前对源文件进行处理(某些C++实现使用翻译器程序将C++程序转换为C程序。这里介绍处理名称以#号开头的编译指令)。不必执行任何特殊的操作来调用预处理器,他会在编译程序时自动运行。

        最开始的示例程序中就使用了#include <iostream>这个编译指令,该编译指令会使预处理器将 iostream 文件的内容添加到程序中。这是一种典型的预处理器操作:在源代码被编译之前,替换或添加文本。

        将 iostream 文件内容添加到程序中就能够实现程序与外部世界的通信。这里的 i 和 o 分别代表in 和 out,in 表示输入、进入程序的信息,out 表示输出、从程序中发送出去的信息。如果要使用 cincout 进行输入和输出的程序需要包含文件iostream。

        2.1.4 头文件名

        像 iostream 这样的文件叫做包含文件(include file)——由于它被包含在其他文件中;也叫头文件(header file)——由于它被包含在文件起始处。C++编译器自带了很多头文件,每个头文件都支持一组特点的工具。C语言的传统是,头文件使用拓展名 h ,例如:头文件 math.h 支持各种C语言数学函数。但是C语言的头文件是没有拓展名的,例如:C++版本的 math.h 为 cmath。

        这里介绍一个在本地编译十分方便的头文件——万能头文件,几乎包含了C++所有的头文件。只需要以下一行预处理指令:

#include <bits/stdc++.h>

        但是只推荐在本地运行时使用这种头文件,因为在大多数的在线测试平台上是不允许这种头文件的,会直接导致编译失败或者编译超时等一系列不可预测的问题。我还是建议大家只需要记住常用的一些头文件就好,以及头文件和函数、常量的关系,没必要把所有的都记下来。

        2.1.5 名称空间

        如果使用 iostream 而不是 iostream.h,则与使用下面的名称空间编译指令来使 iostream 中的定义对程序可用:

using namespace std;

        这条语句叫做using编译指令。名称空间的支持是C++的一项特性,旨在让我们编写大型程序的时候将代码组合起来更容易,有助于组织程序。例如:两个已经封装好的产品,他们都包含一个名为 wanda() 的函数。这样使用 wanda() 函数时,编译器将不知道使用的是哪个。而名称空间可以将代码封装在一个叫做名称空间的单元中,这样就可以用名称空间来指出想要使用哪个产品中的 wanda() 函数,若 wanda() 函数处在一个名为 Microflop 的名称空间中,这样这个函数的全称就变成了 Microflop::wanda(),同理另一个 wanda() 函数放在另一个名为 Piscine 的名称空间中,表示为 Piscine::wanda() 。这样程序就可以通过使用不同的名称空间来区分不同版本的函数: 

//使用Microflop名称空间版本的wanda()函数
Microflop::wanda("CHICO WITH HoneyWorks");

//使用Piscine名称空间版本的wanda()函数
Piscine::wanda("Sword Art Online");

按照这种方式,类、函数和变量便是C++编译器的标准组件,它们都被放在名称空间 std 中。仅当头文件没有拓展名 h 时,情况才是这样。这意味着在 iostream 中定义的用于输出的 cout 变量的全称是 std::cout,而 endl 是 std::endl。因此可以省略编译指令 using:

#include <iostream>
inta main()
{
    std::cout << "Hello World!" ;
    std::cout << std::endl;
}

使用using编译指令可以不需要声明函数、变量等所在的命名空间。

#include <iostream>

//在这里声明命名空间将作用于其后面的所有函数
using namespace std;
int main()
{
    //在这里声明命名空间将只在main()函数内起作用
    //using namespace std;

    cout << "Hello World!" ;
    cout << endl;
}

        2.1.6 使用cout进行C++输出

        使用如下语句可以在控制台上输出 Hello World:

cout << "Hello World" << endl;

        双引号扩起的部分是要打印的消息。在C++中双引号扩起的部分叫做字符串,因为它是由若干字符组合而成的。<< 是两个连着的小于号,符号表示该语句将把这个字符串发送给 cout,该符号指出了信息流动的路径。cout 是一个预定义的对象,知道如何显示字符串、数字和单个字符等。

       cout 对象有一个简单的接口,如果string是一个字符串,则下面的代码将显示该字符串:

cout << string;

        cout 对象属性包括一个插入运算符 << ,它可以将其右侧的信息插入到输出流中。

        控制符endl

        诸如 endl 等对于 cout 来说有特殊含义的特殊符号被称为控制符(manipulator)。和 cout 一样 endl 也是在头文件 iostream 中定义的,且位于命名空间 std 中。

        对于下列程序的作用:重起一行。在输出流中插入 endl 将导致屏幕光标移到下一行开头。

cout << endl;
cout << "我在第一行 ";
cout << "我还在第一行";
cout << endl;
cout << "我在第二行";

输出:
我在第一行 我还在第一行
我在第二行

        换行符

        C++还提供了一种在输出中指示换行的旧方法:C语言符号 \n。\n 被视为一个字符,名为换行符,具体演示:

cout << "我在第一行 ";
cout << "我还在第一行";
cout << "\n";
cout << "我在第二行";

输出:
我在第一行 我还在第一行
我在第二行

也就是说:
语句 cout << "\n"; 与语句 cout << endl; 等价

上述代码还可以表述为:
cout << "我在第一行 ";
cout << "我还在第一行\n";
cout << "我在第二行";
这个输出是和上面的代码一样

        2.1.7 C++源代码的格式化

        有些语言是面向行的,如 FORTRAN,即每条语句占一行。python也是类似的,它以缩进来表示语句之间的关系。然而在C++中,分号标示着一个语句的结束。因此,在C++中回车的作用就和空格和制表符相同。

       极端一点我们甚至可以将所有的代码放在同一行,而中间只使用分号隔开。这样的程序也可以正常运行(如果没有出现语法错误)。但是,为了使我们所编写的代码具有良好的可读性,我们通常会遵守一定的规则去书写程序。 例如:不能把空格、制表符或回车放在元素中间,也不能把回车放在字符串中间。

        源代码中的标记和空白

        一行代码中不可分割的元素叫做标记(token)。通常,必须使用空格、制表符或回车将两个标记分开,空格、制表符和回车统称为空白(white space)。

return 0;    //正确形式
return0;     //不正确
return(0);   //正确
int main();  //正确形式
intmain();   //不正确
int main (); //正确,但是不推荐

        C++源代码风格

        在编写C++程序的时候,清尽量遵守以下规则,这将使你的代码更加美观,增加代码的可读性。有效但是难看的代码一般不会被接受。

        1. 每条语句站一行

        2. 每个函数都有一个开始的花括号和一个结束的花括号,这两个花括号各占一行。

        3. 函数中的语句都相对于花括号进行缩进。

        4. 与函数名称相关的圆括号周围没有空白。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

♡すぎ♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值