03-c++ primerm 第二章 开始学习C++ 2.1.1——2.1.4-进入C++

本章内容包括:
  • 创建C++程序。
  • C++程序的一般格式。
  • #include 编译指令。
  • main() 函数。
  • 使用cout对象进行输出。
  • 在C++程序中加入注释。
  • 何时以及如何使用endl。
  • 声明和使用变量。
  • 使用cin对象进行输入。
  • 定义和使用简单函数。

     要建造简单的房屋,首先要打地基、搭有牢固的结构,后面就很难建造窗子、门框、圆屋顶和镶木地板的舞厅等。同样,学习i计算机语言时,应从程序的基本结构开始学起。只有这样,才能一步一步了解其具体细节,如循环和对象等。本章对C++程序的基本结构做一概述,并预览后面将介绍的主题,如函数和类。

2.1 进入C++

    首先介绍一个显示消息的简单C++程序。程序2.1.1使用C++工具cout生成字符输出。源代码中包含一些供阅读的注释,这些注释都以//打头,编译器将忽略它们。C++对大小写敏感,也就是说区分大写字符和小写字符。这意味着大小写必须于示例中相同。例如,该程序使用的是cout,如果将其替换为Cout或COUT,程序将无法通过编译,并且编译器将指出使用了未知的标识符(编译器也是对拼写铭感的,因此请不要使用kout或coot)。文件扩展名cpp是一种表示C++程序的常用方式,您可能需要使用第一章介绍的其他扩展名。

        补充内容:程序调整
                要在自己的系统上运行该实例,可能需要对其进行修改。有些窗口环境在独立的窗口中运行程序,并在程序运行完毕              后自动关闭该窗口。正如上一章讨论的,要让窗口一直打开,知道您按任何键,开在return 语句前添加如下语句:
                cin.get();
                对于这些程序,要让窗口一直打开,知道您按任何键,必须添加两条这样的语句,第四章将更详细地介绍cin.get()。
                如果您使用的系统很旧,它可能不支持C++98新增的特性。
              有些程序要求编译器对C++11标准提供一定的支持。对于这样的程序,将明确的指出这一点,并在可能的情况下提供非            C++11代码。
    将该程序复制到您选择的编译器中,便可以使用C++编译器创建可执行代码了(参见第一章的介绍)。下面是运行编译后的程序时得到的输出:
           Come up and C++ me some time.
            You won't regret it!
        补充内容:C语言输入和输出
            如果已经使用过C语言进行编程,则看到cout函数(而不是printf()函数)时可能会小吃一惊。事实上,C++能够使用             printf()、scanf()和其他所有标准C输入和输出函数,只需要包含常规C语言的stdio.h文件。不过我们介绍的是C++,所以将         使用C++的输入工具,它们在C版本的基础上作了很多该进。
    您使用函数来创建C++程序。通常,先将程序组织为主要任务,然后设计独立的函数来处理这些任务。程序2.1.1中的示例非常简单,只包含一个名为main()的函数。myfirst.cpp示例包含下述元素。

  • 注释,由前缀//标识。
  • 预处理器编译指令#include。
  • 函数头:int main()。
  • 编译指令using namespace。
  • 函数体,用{和}括起。
  • 使用C++的cout工具显示消息的语句。
  • 结束main()函数的return 语句。

     下面详细介绍这些元素。先来看看main()函数,因为了解了main()的作用后,main()前面的一些特性(如预处理器编译指令)将更易于理解。

2.1.1 main()函数

   去掉修饰后,程序2.1.1中的示例程序的基本结构如下:

int main()

{
     statements
    return 0;

}

    这几行表明有一个名为main()的函数,并描述了该函数的行为。这几行代码构成了函数定义(function definition)。该定义有两部分组成:第一行int main()叫函数头(function heading),花括号({和})中包括的部分叫做函数体。函数体是由函数应该做什么的计算机指令。在C++中,每条完整的指令都称为语句。所有的语句都以分号结束,因此在输入示例代码时,请不要省略分号。

     main()中最后一条语句叫做返回语句(return statement),它结束该函数。本章将讲述有关返回语句的更多知识。

补充内容:语句和分号

    语句是要执行的操作。为理解源代码,编译器需要知道一条语句合适结束,另一条语句何时开始。有些语言使用语句分隔符。例如i,FORTRAN通过行尾将语句分隔开来,Pascal使用分号分隔语句。在Pascal中,有些情况下可以省略分号,例如END前的语句后面,这种情况下,实际上并不没有将两条语句分开。不过C++于C一样,也使用终止符(terminator),而不是分隔符。终止符是一个分号,它是语句的结束标志,是语句的组成部分,而不是语句之间的标记。结论是:在C++中,不能省略分号。

1、作为接口的函数头

    就目前而言,需要记住的主要一点是,C++句法要求main()函数的定义以及函数头ing main()开始。本章后面的“函数”一节将详细讨论函数头句法,然而,为满足大家的好奇心,下面先预览一下。

    通常,C++函数可被其他函数激活或调用,函数头描述了函数于调用它的函数之间的接口。位于函数名前面的部分叫做函数返回类型,它描述的是用函数返回给调用它的函数的信息。函数名后括号中的部分叫做形参列表或参数列表;它描述的是从调用函数传递给被调用函数的信息。这种通用格式用于main()时让人感到游戏迷惑,因为通常并不从程序的其他部分调用main()。

    然而,通常,main()被启动代码调用,而启动代码是由编译器添加到程序中的,是程序和操作系统之间的桥梁。事实上,该函数头描述的是main()和操作系统之间的接口。

    来看下main()的接口描述,该接口从int 开始。C++函数可以给调用函数返回一个值,这个值叫做返回值。在这里,从关键字int 可知,main()返回一个整数值。接下来,是空括号。通常,C++函数在调用另一个函数时,可以将信息传递给该函数。括号中的函数头部分描述的就是这种信息,在这里空括号意味值main()函数不接受恩和信息,或者main()不接受任何参数。(main()不接受任何参数并不意味着main()是不讲道理的、发号施令的函数。相反,术语参数只是计算机人员用来表示一从一个函数传递给另一个函数的信息)。

    简言而之,下面的函数头表面main()函数可以调用它的函数返回一个整数值,而不从调用他的函数那里获得任何信息:

    int main();

     很多现有的程序 都使用经典C函数头:

      main()
    在C语言中,省略返回类型相当于说函数的类型为int 。然而,C++逐步淘汰了这种用法。

    也可以是下面的变体:

    int  main(void)
    在括号中使用关键字void 明确地指出,函数不接受任何参数。在C++(不是C)中,让括号空着于在括号中使用void等效(在C中,让括号空着意味着对是否接受参数保持沉默)。
    有些程序员使用下面的函数头,并省略返会语句:

     void main()

    这在逻辑上是一致的,因为void 返回类型意味着函数不返回任何值。该变体适用于很多操作系统,但由于他不是当前标准强制的一个选项,因此在有些程系统上不能工作。因此,读者应避免使用这种格式,而应使用C++标准格式,这不需要作太多的工作就能完成。

    最后,ANSI/ISO C++标准对那些抱怨必须在main()函数最后包含一条返会语句过于繁琐的做出了让步。如果编译器到达mian()函数末尾时没有遇到返回语句,则认为main()函数以如下语句结尾:

    return 0;

     这条隐含的返回语句只适用于main()函数,而不适用于其他函数。

2、为什么main()不能使用其他名称

    之所以将myfirst,cpp中的函数命名为main(),原因是必须这样做。通常,C++程序必须包含一个名为main()的函数。记住,大小写和拼写都要正确。由于myfirst.cpp程序只有一个函数,因此该函数必须负担器main()的责任。在运行C++程序时,通常从main()函数开始执行。因此,如果没有main(),程序将不完整,编译器将指出未定义main()函数。
    存在一些例外情况。例如在Windows编程中,可以编写一个动态链接库(DLL)模块,这是其他WIndow程序可以使用的代码。由于DLL模块不是独立的程序,因此不需要main()。用于专用环境的程序——如机器人中的控制芯片——可能不需要main()。有些编程环境提供一个框架程序,该程序调用一些非标准函数,如_tmain()。在这种情况下,有一个隐藏的main(),它调用_tmain()。但常规的独立程序都需要main()。

2.1.2 C++注释

    C++注释以双斜杠(//)打头。注释是程序员为别人提供的说明,通常表示程序的一部分或解释代码的摸个方面。编译器忽略注释,毕竟,它对C++的了解至少和程序员一样,在任何情况下,它都不能理解注释。对编译器而言,程序2.1.1就像没有注释一样。

     C++注释以//打头,到行尾结束。注释可以位于单独的一行上,也可以和代码位于同一行。请注意程序清单2.1.1的第一行,这次C++之旅的所有程序均将以注释开头。这些注释指出了源代码的文件名并简要地总结了该程序。在第一章介绍过,源代码的文件扩展名取决于所用的C++系统。在其他系统中,文件名可能为myfirst.C或myfirst.cxx。
    提示:应使用注释来说明程序。程序越复杂,注释的价值越大。注释不仅有助于他人理解这些代码,在有助于程序员自己理解代码。特别是隔了一段时间没有接触该程序的情况下。

补充内容:C-风格注释

    C++也能够识别C注释,C注释包括在符号/*和*/之间。
    #include<iostream>/*a C-style comment*/
   由于C-风格注释以*/结束,而不是到行尾结束,因此可以跨越多行。可以在程序中使用C或C++风格的注释,也可以同时使用着两种注释。但应尽量使用C++注释,因为这不涉及到结尾符号于起始符号的正确配对,所以它产生问题的可能性很小。事实上,C99标准也在C语言中添加了//注释。

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

    下面简要介绍一下需要知道的一些知识。如果程序要使用C++输入或输出工具,请提供这样两行代码:
    #include<iostream>
    using namespace std;
     可使用其他代码代替第二行,这里使用这行代码旨在简化程序(如果编译器不接受这几行代码,则说明它没有准守标准C++98,使用它来编译示例代码时,将出现众多其他的问题)。为使程序正常工作,只需要知道这些,下面更升入的介绍一下这些内容。
         C++和C一样,也使用一个预处理器,该程序在进行编译之前对源文件进行处理(第一章介绍过,有些C++实现使用的编译器程序将C++程序转换为C程序。虽然翻译器也是一种预处理器,但这里不讨论这种预处理器,而只讨论这样的预处理器,即它处理名称以#开头的编译指令)。不必执行任何特殊的操作来调用该预处理器,它会在编译程序是自动运行。
    程序2.1.1使用了#include编译指令:
    该编译指令导致预处理器将iostream文件的内容添加到程序中,这是一种典型的预处理器操作;在源代码被编译之前,替换或添加文本。
    这里提出了一个问题,为什么要将iostream文件的内容添加到程序中呢?答案涉及程序与外部世界之间的通信。iostream问的io指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。C++输入/输出方案涉及iostream文件汇总的多个定义。为了使用cout来显示消息,第一个程序需要这些定义。#include编译指令导致iostram文件中的内容随源代码文件的内容一起被发送给编译器。实际上,iostream文件的内容将取代程序中的代码行#include<iostream>。原始文件没有被修改,而是将源代码文件和iostream组合成一个复合文件,编译的下一阶段将使用该文件。

注意:使用cin和cout进行输入和输出的程序必须抱哈文件iostream。

2.1.4 头文件名

    像iostream这样的文件叫做包含文件——由于它们被包含在其他文件中:也叫头文件——由于它们被包含在文件的起始处。C++编译器自带了很多头文件,每个头文件都支持一组特定的工具。C语言的传统是,头文件使用扩展名h,将其作为一种通过名称标识文件类型的简单方式。例如,头文件math.h支持各种C语言数学函数,但C++的用法变了。现在,对老式C的头文件被转换成C++头文件,这些文件被重新命名,去掉了扩展名h(使之成为C++风格的名称)。并在文件名成前面加上前缀c(表面来自C语言)。例如,C++版本的math.h为cmath。有时C头文件的C版本和C++版本相同,而有时候新版本做了一些修改。对于纯粹的C++头文件(如iostream)来书,去掉h不只是形式上的变化,没有h的头文件也可以包含名称空间——本章的下一个主题。
    由于C使用不同的文件扩展名来表示不同文件类型,因此用一些特殊的扩展名(如.hpp或.hxx)表示C++头文件是有道理的额,ANSI/IOS委员会也会这样人文。问题在于究竟使用哪种扩展名,因此最终他们一致认为不适用任何扩展名。


猜你喜欢

转载自blog.csdn.net/qq_41200424/article/details/80276207