【C++】C++对C语言的关系,拓展及命名空间的使用

news2025/1/17 5:53:42

请添加图片描述

文章目录

  • 📝C++简述
    • C++融合了3种不同的编程方式:
    • C++和C语言关系是啥呢?
    • C++标准
  • 🌠C++应用
  • 🌠C++语言优点
    • 第一个C++程序
  • 🌠命名空间
  • 🌠命名空间的使用
    • 命名空间的定义
  • 🌠怎么使用命名空间中的内容呢?
      • 1. 直接使用完全限定名
      • 2. 使用`using`声明
      • 3. 使用`using`指令
      • 4. 嵌套命名空间
      • 使用注意事项
      • 命名空间的作用域


📝C++简述

C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup于1979年首次推出,C++是一种高级编程语言,它是在C语言的基础上发展而来,融合了面向对象的思想。它的特点是高效、低级和面向对象。
在C++的发展历程中,最为重要的里程碑是C++11标准的发布。C++11版本增加了许多现代化的特性,例如类型推断、lambdas表达式、移动语义、多线程支持等,大大提高了C++的编程效率和效果。

C++被广泛应用于游戏开发、图形图像处理、嵌入式系统等领域。例如腾讯公司就广泛使用C++来开发游戏引擎、QQ客户端等产品。C++也是Linux内核和Windows系统的主要实现语言。

在编程界,C++已经有40多年的历史,尽管时代不断变迁,但C++依然是系统级和高性能领域的首选语言之一。它在各大编程语言排行榜上长期位居前茅,被众多科技巨头广泛应用。

C++融合了3种不同的编程方式:

  • C语言代表的过程性语言
  • C++在C语言基础上添加的类代表的面向对象语言。
  • C++模板支持的泛型编程。

C++和C语言关系是啥呢?

C++语言是在C语言基础上,添加了面向对象,模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。

注意:C语言C++并不是对立的竞争关系:
C++是C语言的加强,是一种更好的C语言。
C++是以C语言为基础的,并且完全兼容C语言的特性。

C++标准

这里是关于C++程序可移植性的标准:

一、是否需要修改代码

如果一个C++程序满足以下条件,则在重新编译后可以在新平台直接运行,无需修改源代码:

  1. 程序只调用标准C++语言元素和标准库功能,不依赖任何特定平台的库或API

  2. 程序不直接访问硬件,不依赖特定的指令集或CPU架构。

  3. 程序遵循当前ISO标准的C++语言规范和标准库定义。

二、实现可移植性的两个关键点

  1. 硬件依赖性:如果程序直接访问硬件或依赖特定的指令集,则不具有良好的移植性。

  2. 语言实现的一致性:不同平台下编译器对C++标准的实现应保持一致,以确保可移植性。

三、C++标准的制定与发展

  1. ANSI和ISO联合委员会从1990年开始制定统一的C++标准。

  2. 最早的标准ISO/IEC 14882:1998为C++奠定了基础。

  3. 后续标准不断修订和增强语言功能,但保持向下兼容。

  4. 标准库提供跨平台的接口,有助于提高程序的可移植性。

  5. 如果遵循标准,理论上程序可以在任何支持该标准的平台上通过重新编译直接运行。

以上就是关于C++程序可移植性的一些基本标准和原则。如果满足这些条件,则可以实现跨平台良好的可移植性。

如果你想了解C++标准有关版本,可以看看以下:

  • C++98标准:发布于1998年,这是C++语言的第一个正式标准版本。

  • C++03标准:发布于2003年,主要是对C++98标准的一些细微修改和补充。

  • C++11标准:发布于2011年,这是一个重要的标准版本,增加了许多新的语言特性,如auto类型推导、lambda表达式、智能指针等。

  • C++14标准:发布于2014年,基于C++11标准进行了一些增强,如常量表达式、二进制字面量等。

  • C++17标准:发布于2017年,主要新增了模块化支持、 paralle programming支持等新特性。

  • C++20标准:发布于2020年,主要新增了范围for循环、概括模板、可变参数模板等功能。

🌠C++应用

腾讯超级喜欢C++开发? 作为互联网巨头之一的腾讯,一向都是众多游戏公司和科技企业的风向标

腾讯的历史原因 1998年,腾讯成立之初主要开发BBS论坛系统,当时常用的开发语言有PHPASP等脚本语言以及C/C++两种编程语言。由于需要开发游戏等产品,出于性能考虑,腾讯最初选择了C/C++来开发。

随着业务的扩展,腾讯游戏业务迅速发展,需要支持3D图形等游戏引擎,这就决定了必须选择C/C++这种低级语言来开发。从此,C/C++成为腾讯主打的技术方向。

腾讯发展的必然选择 经过20多年的发展,腾讯游戏和IT技术团队已经有数以万计的C/C++开发人员,在游戏引擎和系统开发等领域有着非常深厚的技术积累。

目前腾讯的QQ客户端、微信公众号平台等核心产品都是基于C/C++技术研发的。从游戏引擎、多媒体处理到操作系统开发,C/C++作为系统级语言的优势很明显。因此,C/C++成为腾讯不二选择。

🌠C++语言优点

C++有8大特性,也就是它的8大优点:

⽂件使⽤⽅式含义
跨平台/可移植性跨平台是C++语言的核心优势,在设计之初C++就很注重可移植性和跨平台性,因为C++的运行不依赖任何虚拟机,编译生成的可执行文件可以直接在任何支持该平台的操作系统上运行,省去了大量的代码重复编写时间。
安全性C++提供了面向对象、模板和异常等机制,可以有效避免资源泄漏和错误的访问,使程序更安全可靠。
面向对象C++是完全的面向对象语言,非常适合大型软件的设计和开发。
简单性C++比C语言增加了更多面向对象的特性,如类、继承、重载等,在保留C语言简单易用的同时提高了程序的可维护性。
高性能C++的性能一直处于领先地位,尤其是在游戏、图形和嵌入式系统等领域。
分布式C++支持网络编程和远程调用,可以开发分布式系统。
多线程C++11标准增加了多线程支持,可以方便高效地开发多线程程序。
健壮性C++提供智能指针、异常处理等机制,减少内存泄漏和崩溃的可能性,使程序更健壮可靠。

第一个C++程序

#include <iostream>
using namespace std;//使用std命名空间
int main(int argc , char *argv[])
{
    int a;
    a=10;
    cout <<"a:" <<a<<endl;
    cout << "Hello, World!" << endl;
    return 0;
}

在这里插入图片描述
输出:
在这里插入图片描述
注意:
1️⃣、在C语言中,头文件使用扩展名.h,作为一种简单的通过名称标识文件类型的方式。然而,C++的用法有所改变,C++头文件不使用扩展名。有些C语言的头文件被转换为C++头文件,这些文件被重新命名,去掉了.h扩展名(转为C++风格头文件),并在文件名前加上前缀c(表示来自C语言)。例如,C++版本的math.h变为cmathstdio.h变为cstdiostdlib.h变为cstdlib

2️⃣、命名空间是指标识符的各种可见范围。使用关键字namespace来定义命名空间。命名空间是C++的一种机制,用于将具有逻辑关联的大量程序实体组合在一起,这些实体共享相同的标识符。std是命名空间(名字空间)的名称,命名空间的主要作用是解决日益严重的名称冲突问题。随着可重用代码的增加,不同代码库中同名标识符之间的冲突会显著增加。解决方法是将不同的代码库放置在不同的命名空间中。
思考:如果在项目中需要定义两个名为func的函数,并且这两个函数都可以被其他文件访问,应该怎么办?

答:如果在同一个项目中需要定义两个同名函数func,而这两个函数都需要被其他文件访问,可以采取以下方法:

  1. 使用命名空间

可以把两个func函数放入不同的命名空间中,比如:

namespace space1 
{
  void func() {
    // func定义1
  }
}

namespace space2 
{
  void func() {
   // func定义2 
  }
}

然后其他文件使用时加上命名空间前缀区分,如space1::func()space2::func()

  1. 使用函数重载

可以给两个func函数添加不同的参数列表进行函数重载:

void func() 
{
  // func定义1
}

void func(int x) 
{
  // func定义2
}
  1. 将函数定义放在不同的头文件中

比如func1.hfunc2.h,然后分别#include相应的头文件。

  1. 使用类

可以将两个func函数定义在不同的类中:

class A 
{
public:
  void func() {/*func1定义*/} 
};

class B 
{
public:
  void func() {/*func2定义*/}
};

总之,通过命名空间,函数重载,不同头文件以及类等机制可以很好地区分开两个同名函数。
3️⃣、coutC++中的标准输出流,endl用于输出换行并刷新缓冲区。

🌠命名空间

C++命名空间的基本概念:

  1. 在大型项目开发中,会涉及大量名称(如常量、变量、函数、类等),名称管理是程序设计的基本活动之一。C++通过命名空间的机制,可以控制名称的产生和访问范围。

  2. C++中所有名称,如符号常量、变量、宏、函数、结构、枚举、类以及对象等都是可以定义在命名空间中的。

  3. std命名空间是C++标准命名空间。C++标准库中的所有标识符如iostream类和vector类都是定义在这个std命名空间中的。如果需要使用这些标准库中的功能,需要添加using声明或使用std前缀来限定名称,比如使用std::cout输出。

🌠命名空间的使用

命名空间的定义

C++中的命名空间是一种封装标识符(如变量名、函数名、类名等)的方式,用于防止命名冲突。命名空间允许组织代码以避免可能出现的标识符冲突,尤其是在大型项目或者在使用多个库时。它可以被视为一种定义标识符的作用域,这些标识符在该命名空间内是可见的,而在命名空间外则不是。

定义命名空间的基本语法如下:

namespace 名称 {
    // 定义变量、函数、类等
}

这里,名称是你给命名空间指定的名字,可以根据需要在里面定义变量、函数、类等。

例如,定义一个名为myNamespace的命名空间,并在其中定义一个函数和一个变量:

namespace myNamespace 
{
    int myVariable = 0;
    void myFunction() 
    {
        // 函数实现
    }
}

使用命名空间内的成员时,需要使用命名空间的名称和作用域解析运算符::来指定,如myNamespace::myVariablemyNamespace::myFunction()

命名空间可以嵌套定义,即一个命名空间内可以定义另一个命名空间。此外,C++还支持匿名命名空间和内联命名空间的概念。匿名命名空间是在文件内部提供了一个独一无二的命名空间,而内联命名空间则允许在外层命名空间直接访问内联命名空间中的成员,无需通过作用域解析运算符。

ok来举个例子:

#include <iostream>

// 外层命名空间
namespace outerNamespace {
    int outerVar = 10;

    // 嵌套命名空间
    namespace nestedNamespace {
        void nestedFunction() {
            std::cout << "Inside nestedFunction" << std::endl;
        }
    }

    // 内联命名空间
    inline namespace inlineNamespace {
        void inlineFunction() {
            std::cout << "Inside inlineFunction" << std::endl;
        }
    }
}

// 匿名命名空间
namespace {
    void anonymousFunction() {
        std::cout << "Inside anonymousFunction" << std::endl;
    }
}

int main() {
    // 访问外层命名空间变量
    std::cout << "outerVar: " << outerNamespace::outerVar << std::endl;
    
    // 访问嵌套命名空间的函数
    outerNamespace::nestedNamespace::nestedFunction();
    
    // 由于inlineFunction在内联命名空间中,可以直接通过外层命名空间访问
    outerNamespace::inlineFunction();
    
    // 直接访问匿名命名空间中的函数
    anonymousFunction();

    return 0;
}

每个对应输出:
在这里插入图片描述

解析:在这个例子中,我们定义了一个外层命名空间outerNamespace,它包含一个变量outerVar、一个嵌套命名空间nestedNamespace和一个内联命名空间inlineNamespacenestedNamespace内定义了一个函数nestedFunction(),而inlineNamespace内定义了一个函数inlineFunction()。因为inlineFunction()在内联命名空间中,它可以被当作是直接在outerNamespace中定义的,所以我们可以不通过内联命名空间的名称直接访问它。

此外,我们还定义了一个匿名命名空间,并在其中定义了函数anonymousFunction()。由于匿名命名空间的特性,该函数只在定义它的文件内部可见,从而提供了一种限制访问范围的方法。

注意

  • 命名空间的名字可以重复,这种重复并非两个不同的命名空间,而是在编译过程中将相同名字的命名空间合并,事实上还是一个命名空间
  • 命名空间不能在类和函数中定义

C++的using指令或using声明可以用来简化命名空间成员的访问,但过度使用可能会引起名称冲突的问题。

🌠怎么使用命名空间中的内容呢?

在C++中,使用命名空间中的内容主要有以下几种方式:

1. 直接使用完全限定名

这是最直接的方式,通过命名空间的名称和作用域解析运算符::来访问命名空间中的变量、函数或类型。例如:

#include <iostream>
namespace MyNamespace {
    void myFunction() {
        // 函数实现
        std::cout<<"void myFunction()"<<std::endl;
    }
    int myVariable = 42;
}

使用完全限定名来访问:

int main() 
{
    MyNamespace::myFunction(); // 调用函数
    int value = MyNamespace::myVariable; // 访问变量
    std::cout<<value<<std::endl;
    return 0;
}

输出:
在这里插入图片描述

2. 使用using声明

你可以使用using声明来引入命名空间中特定的名称,从而在当前作用域中直接使用这个名称,而不需要每次都提供完整的命名空间前缀。例如:

using MyNamespace::myFunction;
using MyNamespace::myVariable;

int main() {
    myFunction(); // 现在可以直接调用函数,无需命名空间前缀
    int value = myVariable; // 直接访问变量
    std::cout<<value<<std::endl;
    return 0;
}

3. 使用using指令

使用using指令可以将命名空间中的所有名称引入当前作用域,这样你就可以直接使用这些名称而不需要命名空间前缀。但这种方法可能会导致名称冲突,特别是当引入多个命名空间中有相同名称的成员时。例如:

using namespace MyNamespace;

int main() 
{
    myFunction(); // 直接调用,无需前缀
    int value = myVariable; // 直接访问
    std::cout<<value<<std::endl;
    return 0;
}

4. 嵌套命名空间

考虑有如下嵌套命名空间Outer::Inner,并在内部定义了innerFunction:

namespace Outer 
{
    namespace Inner 
    {
        void innerFunction() 
        {
            // 函数实现
            std::cout<<"void innerFunction()"<<std::endl;
        }
    }
}

在C++17及之后,可以使用嵌套命名空间的简化写法:

namespace Outer::Inner 
{
    void innerFunction() 
    {
        // 实现
         std::cout<<"void innerFunction()"<<std::endl;
    }
}

使用完全限定名访问:

int main() {
    Outer::Inner::innerFunction(); // 直接调用嵌套命名空间中的函数
    return 0;
}

输出:

void innerFunction()

或者使用using指令或声明简化访问:

using namespace Outer::Inner; // 引入嵌套命名空间
// 或者
using Outer::Inner::innerFunction;

int main() {
    innerFunction(); // 直接调用
    return 0;
}

输出:

void innerFunction()

使用注意事项

  • 精确性:直接使用完全限定名是最精确的方式,可以避免任何潜在的命名冲突。
  • 简洁性与清晰性using声明和using指令可以使代码更简洁,但过度使用可能会降低代码的清晰性和可维护性,特别是在大型项目或者使用多个库时。
  • 作用域考虑:使用using声明和using指令时,应该考虑到它们的作用域。通常,将它们放在函数内部或者局部作用域内可以减少潜在的命名冲突和其他问题。

命名空间的作用域

使用using namespace命名空间名称引入,可以将命名空间中的所有成员引入到当前作用域中,可以直接使用命名空间中的成员,而不需要使用命名空间前缀。

#include <iostream>
using namespace std;
namespace A
{
    int a = 10;
    int b = 66;
    int c = 108;
}
namespace B
{
    int a = 10;
    int b = 6;
    int c = 109;
}
int a = 36;

using namespace A;
using namespace B;

int main()
{
    //std::cout<<a<<std::endl;//这种写法是错误的,因为全局中定义了a,命名空间tmh中的a也展开在了全局域
    std::cout<<::a<<std::endl;//正确:访问全局的a,::左边空白表示全局域
    std::cout<<A::a<<std::endl;//正确:访问A中的a
    //std::cout<<b<<std::endl;//错误,应严格写出哪个命名空间的b
    int c = 999;
    c++;//当前局部的c设置成999,局部变量优先,没有特别的指示优先使用局部域中的元素
    std::cout<<c<<std::endl;
    return 0;
}

输出:
在这里插入图片描述


感谢你的收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个小小帮助,可以给博主点一个小小的赞😘

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习入门到不想放弃-3

第三节我们主要讲一下SARSA模型 上节课的链接:强化学习入门到不想放弃-2 (qq.com) 有模型的概念:简单理解,上节课我讲的就是有模型,就是可以开上帝视角,知道全局地图 无模型的概念: 打CS,但是看不到地图的情况,全凭自己探索 今天的讲解环境还是和上节课一样,如下…

Movelt使用笔记-Movelt Setup Assistant

目录 Setup Assistant配置1 Start 加载urdf模型3 Virtual joints 虚拟关节5 Robot Poses 机器人位姿7 Passive Joints 被动关节8 Controllers 控制器9 Simulation 仿真10 3D Perception 3D感知11 Author Information 作者信息12 Configuration Files 配置文件启动MoveIt!Setup…

【Python笔记-设计模式】前端控制器模式

一、说明 常作为MVC&#xff08;Model-View-Controller&#xff09;模式的一部分&#xff0c;用来处理用户请求并将其分发给相应的处理程序&#xff08;即路由匹配&#xff09;。 (一) 解决问题 将请求的处理流程集中管理&#xff0c;统一处理所有的请求 (二) 使用场景 需…

学习或从事鸿蒙开发工作,有学历要求吗?

目前安卓有2,000万的开发者。本科及以上学历占比为35%&#xff1b;iOS有2,400万开发者&#xff0c;本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历&#xff0c;在2023年华为开发者大会上余承东透露华为的开发者目前有200万&#xff0c;但鸿蒙开发者统计的数据…

3.WEB渗透测试-前置基础知识-快速搭建渗透环境(上)

上一个内容&#xff1a;2.WEB渗透测试-前置基础知识-web基础知识和操作系统-CSDN博客 1.安装虚拟机系统 linux Kali官网下载地址&#xff1a; https://www.kali.org/get-kali/#kali-bare-metal Centos官网下载地址&#xff1a; https://www.centos.org/download/ Deepin官网下…

每个学计算机同学都应该有个创业梦

推荐计算机专业必看的两部电影 经典记录片电影《社交网络》推荐理由豆瓣评分电影简介 德国犯罪喜剧《如何在网上卖迷幻药》推荐理由剧情简介 两部电影主角对比 经典记录片电影《社交网络》 纪录扎克伯格&#xff0c;7年时间&#xff0c;从一名大学生摇身变成亿万富翁的故事 推荐…

解读OpenAI Sora文生视频技术原理

OpenAI Sora文生视频&#xff08;图像看作单帧视频&#xff09;一放出就炸翻整个AI 圈&#xff0c;也是ChatGPT掀起GenAI热潮时隔一年后&#xff0c;OpenAI再次史诗级的更新。OpenAI 随后公布的技术综述[文献1]&#xff0c;难掩其勃勃雄心&#xff1a;视频生成模型作为世界模拟…

Matlab自学笔记二十七:详解格式化文本sprintf各参数设置方法

1.一个程序引例 上篇文章已经介绍了格式化文本的初步应用&#xff0c;程序示例如下&#xff1a; sprintf(|%f\n|%.2f\n|%8.2f,pi*ones(1,3)) 2.格式化操作符各字段的含义解析 格式化操作符可以有六个字段&#xff0c;只有主字符%和转换格式是必需的&#xff0c;其他都是可选…

CSS3中盒子居中

&#xff08;1&#xff09;利用定位&#xff08;子绝父相&#xff09;、margin-left、和margin-top实现 &#xff08;2&#xff09;利用定位&#xff08;子绝父相&#xff09;、transfrom属性实现 &#xff08;3&#xff09;利用flex布局实现盒子居中

中科大计网学习记录笔记(十五):可靠数据传输的原理

前前言&#xff1a;看过本节的朋友应该都知道本节长度长的吓人&#xff0c;但其实内容含量和之前的差不多&#xff0c;老师在本节课举的例子和解释比较多&#xff0c;所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题&#xff0c;先明确出现的问题是…

Ubuntu22.04和Windows10双系统安装

概要 本篇演示Ubuntu22.04和Windows10双系统的安装。先安装Ubuntu22.04&#xff0c;再安装Windows10。 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 电脑开机按F2进入BIOS 电脑开机按F12进入Boot Manager 2、U盘启动盘 需要用到两个U盘启动盘 &#xff08;1&a…

IO进程线程day7作业

使用消息队列完成两个进程间相互通信 代码&#xff1a; msgsnd.c #include<myhead.h>//定义消息类型 struct msgbuf {long mtype;char mtext[1024]; };//宏表示消息正文大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const char *argv[…

【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间两数之和辅助哈希使用map存储出现过的值,key为值大小,value为下标位置,…

C++-带你走进多态(1)

1. 多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

OSCP靶机--AuthBy

OSCP靶机–AuthBy 1.考点 (1. ftp匿名登陆&#xff0c;搜集信息 2.ftp弱密码 3.hash破解【hashcat与john】4.Windows_Server_2008_R2_Enterprise 土豆提权(32bit)) 1.nmap ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.225.46 -sV -sC -p- --min-rate 5000 Startin…

【Django开发】0到1开发美多shop项目:用户登录模块开发。全md文档笔记(附代码 文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现前后端…

undo日志详解

一、undo日志介绍 上一节详细的说了redo日志&#xff0c;redo日志的功能就是把增删改操作都记录着&#xff0c;如果断电导致内存中的脏页丢失&#xff0c;可以根据磁盘中的redo日志文件进行恢复。redo日志被设计出来是为了保证数据库的持久性&#xff0c;undo日志设计出来是为…

【Java程序设计】【C00278】基于Springboot的数码论坛管理系统(有论文)

基于Springboot的数码论坛管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的数码论坛系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、…

CSS列表学习2

之前学习了列表&#xff1b;继续熟悉&#xff1b; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title></title><meta charset"utf-8" /><…