当前位置:首页 > 文化百科

c项目和c++项目有什么区别(c语言编程赛事外包项目项目)

2022-11-14 16:05:48

  相信很多学习C和C++的小伙伴都有一个共同的问题,那就是“C和C++到底有什么区别?”下面人邮君就来好好给大家说道说道!(小伙伴们记得收藏哦,下次别人再问你C和C++有什么区别,直接把链接甩给他~)

  在很大程度上,C++是C的超集。但是,C++中有许多规则与C稍有不同,这些不同使得用C++编译器编译C程序时可能会以与代码初衷不同的方式运行,甚至有时根本不能运行。

  要想了解C语言和C++之间的区别,首先要明确C语言和C++各自都是在不断发展并拥有多个版本的。比如C语言就包含1978年出版的《The C Programming Language》中的最初的非正式标准K&R C、1989年发布的C语言的第一个官方版本C89(又称C90、ANSI C、ISO C、ANSI/ISO C)、1999年发布的第二个官方版本C99、2011年发布的第三个官方版本C11和2018年发布的第四个官方版本C18,而C++又包含1985年的C++1.0、1989年的C++2.0、1993年的C++3.0以及同样以年份命名的C++98标准、C++03标准、C++11标准、C++14标准、C++17标准、C++20标准。

  C Primer Plus第6版中文版(异步图书出品)

  ¥90.5

  购买

  显然,由于有如此多版本的语言标准,C和C++之间的区别也是在不断变化着的。比如:

  C99标准由于允许在代码中的任意处进行声明,并且可以识别注释指示符“//”,从而使得某些情况下该标准的C更接近C++。而在其他方面,如C99标准新增的变长数组和关键字restrict,又使C与C++的差异变大。

  C11标准则由于引进了char16_t类型、新增了关键字_Alignas、新增了alignas宏与C++的关键字匹配,而缩小了C与C++的差异。

  但在实际应用中,由于众多程序员们往往习惯了长期使用的旧版本,许多编译器开发商都不会完全紧跟最新的语言标准。故而,本文主要讨论C99、C11和C++之间的区别。

  01函数原型

  在C++中,函数原型必不可少,但是在C中是可选的。

  这一区别最直观的体现,在于当声明一个函数而让函数名后面的圆括号为空时。

  在C中,空圆括号说明这是前置原型,而在C++中,则说明该函数没有参数。

  也就是说,在C++中,int slice();和int slice(void);相同。例如,下面旧风格的代码在C中可以接受,但是在C++中会产生错误:

  int slice();

  int main()

  {

  ...

  slice(20,50);

  ...

  }

  int slice(int a,int b)

  {

  ...

  }

  在C中,编译器假定用户使用旧风格声明函数,而在C++中,编译器假定slice()与slice(void)相同,且未声明slice(int,int)函数。

  另外,C++允许用户声明多个同名函数,只要它们的参数列表不同即可。

  02 char常量

  C把char常量视为int类型,而C++将其视为char类型。

  例如,考虑下面的语句:

  char ch='A';

  在C中,常量'A'被储存在int大小的内存块中。更精确地说,字符编码被储存为一个int类型的值。相同的数值也储存在变量ch中,但是在ch中该值只占据内存的1个字节。

  而在C++中,'A'和ch都占用1个字节。它们的区别不会影响上述示例。但是,有些C程序利用Char常量被视为int类型这一特性,用字符来表示整数值。例如,如果一个系统中的int是4字节的,就可以这样编写C代码:

  int x='ABCD';/*对于int是4字节的系统,该语句出现在C程序中没问题,但是出现在C++程序中会出错*/

  'ABCD'表示一个4字节的int类型值,其中第1个字节储存A的字符编码,第2个字节储存B的字符编码,以此类推。注意,'ABCD'和"ABCD"不同。前者只是书写int类型值的一种方式,而后者是一个字符串,它对应一个5字节内存块的地址。

  考虑下面的代码:

  int x='ABCD';

  char c='ABCD';

  printf("%d%d%c%c\n",x,'ABCD',c,'ABCD');

  在C编译器中,上述代码得到的输出如下:

  1094861636 1094861636 D D

  这说明,如果把'ABCD'视为int类型,它是一个4字节的整数值。但是,如果将其视为char类型,程序只使用最后一个字节。在我们的系统中,尝试用%s转换说明打印'ABCD'会导致程序崩溃,因为'ABCD'的数值(1094861636)已超出该类型可表示的范围。

  可以这样使用的原因是C提供了一种方法,可以单独设置int类型中的每个字节,因为每个字符都对应一个字节。但是,由于要依赖特定的字符编码,所以更好的方法是使用十六进制的整型常量,因为每两位十六进制数对应一个字节。

  C语言程序设计入门教程:C Primer Plus第6版中文版+习题解答(套装2册)(异步图书出品)

  ¥113.4

  购买

  对于这部分内容,《C primer plus第6版》的第15章有详细的介绍。C的早期版本不提供十六进制记法,这也许是多字符常量技术首先得到发展的原因。

  03 const限定符

  在C中,全局的const具有外部链接,但是在C++中,全局const则具有内部链接。

  也就是说,如下的C++声明:

  const double PI=3.14159;

  相当于下面C中的声明:

  static const double PI=3.14159;

  假设这两条声明都在所有函数的外部。C++规则的意图是为了在头文件中更加方便地使用const:如果const变量是内部链接,每个包含该头文件的文件都会获得一份const变量的备份;如果const变量是外部链接,就必须在一个文件中进行定义式声明,然后在其他文件中使用关键字extern进行引用式声明。

  C++Primer Plus第6版中文版(异步图书出品)

  ¥93

  购买

  顺带一提,C++可以使用关键字extern使一个const值具有外部链接。所以两种语言都可以创建内部链接和外部链接的const变量。它们的区别在于默认使用哪种链接。

  另外,在C++中,可以用const来声明普通数组的大小:

  const int ARSIZE=100;

  double loons[ARSIZE];/*在C++中,与double loons[100];相同*/

  当然,也可以在C99中使用相同的声明,不过这样的声明会创建一个变长数组。在C++中,可以使用const值来初始化其他const变量,但是在C中不能这样做:

  const double RATE=0.06;//C++和C都可以

  const double STEP=24.5;//C++和C都可以

  const double LEVEL=RATE*STEP;//C++可以,C不可以

  04结构和联合

  声明一个有标记的结构或联合后,就可以在C++中使用这个标记作为类型名:

  struct duo{

  int a;

  int b;

  };

  struct duo m;/*C和C++都可以*/

  duo n;/*C不可以,C++可以*/

  如果把上面的代码作为C程序编译,结果则是结构名会与变量名冲突。

  相应地,下面的程序可作为C程序编译,但是作为C++程序编译时会失败。因为C++把printf()语句中的duo解释成结构类型而不是外部变量:

  #include

  float duo=100.3;

  int main(void){

  struct duo{int a;int b;};

  struct duo y={2,4};

  printf("%f\n",duo);/*在C中没问题,但是在C++不行*/

  return 0;}

  在C和C++中,都可以在一个结构的内部声明另一个结构:

  struct box{

  struct point{int x;int y;}upperleft;

  struct point lowerright;

  };

  在C中,随后可以使用任意使用这些结构,但是在C++中使用嵌套结构时要使用一个特殊的符号:

  struct box ad;/*C和C++都可以*/

  struct point dot;/*C可以,C++不行*/

  box::point dot;/*C不行,C++可以*/

  C++语言入门经典教程:C++Primer Plus第6版中文版+中文版习题解答(套装2册)(异步图书出品)

  ¥121.8

  购买

  05枚举

  C++使用枚举比C严格。

  特别是,在C++中,只能把enum常量赋给enum变量,然后把变量与其他值作比较;如果不经过显式强制类型转换,不能把int类型值赋给enum变量,而且也不能递增一个enum变量。下面的代码说明了这些问题:

  enum sample{sage,thyme,salt,pepper};

  enum sample season;

  season=sage;/*C和C++都可以*/

  season=2;/*在C中会发出警告,在C++中是一个错误*/

  season=(enum sample)3;/*C和C++都可以*/

  season++;/*C可以,在C++中是一个错误*/

  另外,在C++中,不使用关键字enum也可以声明枚举变量:

  enum sample{sage,thyme,salt,pepper};

  sample season;/*C++可以,在C中不可以*/

  与结构和联合的情况类似,如果一个变量和enum类型同名,会导致名称冲突。

  06指向void的指针

  C++可以把任意类型的指针赋给指向void的指针,这点与C相同。

  但是不同的是,C++只有使用显式强制类型转换,才能把指向void的指针赋给其他类型的指针。

  下面的代码说明了这一点:

  int ar[5]={4,5,6,7,8};

  int*pi;

  void*pv;

  pv=ar;/*C和C++都可以*/

  pi=pv;/*C可以,C++不可以*/

  pi=(int*)pv;/*C和C++都可以*/

  C++与C的另一个区别是,C++可以把派生类对象的地址赋给基类指针,但是在C中没有这里涉及的特性。

  07布尔类型

  在C++中,布尔类型是bool,而且ture和false都是关键字。

  而在C中,布尔类型是_Bool,而且要包含stdbool.h头文件才可以使用bool、true和false。

  08可选拼写

  在C++中,可以用or来代替||,还有一些其他的可选拼写,它们都是关键字。

  而在C99和C11中,这些可选拼写都被定义为宏,要包含iso646.h才能使用它们。

  09宽字符支持

  在C++中,wchar_t是内置类型,而且wchar_t是关键字。

  而在C99和C11中,wchar_t类型被定义在多个头文件中,如stddef.h、stdlib.h、wchar.h、wctype.h。

  与此类似,char16_t和char32_t都是C++11的关键字,但是在C11中它们都定义在uchar.h头文件中。

  C++通过iostream头文件提供宽字符I/O支持(wchar_t、char16_t和char32_t),而C99通过wchar.h头文件提供一种完全不同的I/O支持包。

  10复数类型

  C++在complex头文件中提供一个复数类来支持复数类型。

  而C有内置的复数类型,并通过complex.h头文件来支持。

  这两种方法区别很大,不兼容。C更关心数值计算社区提出的需求。

  11内联函数

  C99支持了C++的内联函数特性。但是,C99的实现更加灵活。

  在C++中,内联函数默认是内部链接。如果一个内联函数多次出现在多个文件中,该函数的定义必须相同,而且要使用相同的语言记号。例如,不允许在一个文件的定义中使用int类型形参,而在另一个文件的定义中使用int32_t类型形参,即使用typedef把int32_t定义为int也不能这样做。但是在C中可以这样做。

  另外,《C primer plus第6版》的第15章中表示,C允许混合使用内联定义和外部定义,而C++不允许。

  12 C++11中没有的C99/C11特性

  虽然在过去C或多或少可以看作是C++的子集,但是C99标准增加了一些C++没有的新特性。下面列出了一些只有C99/C11中才有的特性:

  指定初始化器

  受限指针(Restricted pointer,即restric指针)

  变长数组

  伸缩型数组成员

  带可变数量参数的宏

  如果你是学习C的同学,人邮君非常推荐阅读《C Primer Plus第6版》。

  《C Primer Plus第6版》作为计算机科学的经典著作,是一本经过仔细测试、精心设计的完整C语言教程,它涵盖了C语言编程中的核心内容,讲解了包含结构化代码和自顶向下设计在内的程序设计原则。

  《C Primer Plus第6版》的目标是为读者提供一本入门型、条理清晰、见解深刻的C语言教程。作者把基础的编程概念与C语言的细节很好地融合在一起,并通过大量短小精悍而完整可运行的示例同时演示一两个概念,通过学以致用的方式鼓励读者掌握新的主题。

  每章末尾的复习题和编程练习题进一步强化了本章中的重要信息,有助于读者理解和消化那些较为困难的概念。同时采用了友好、易于使用的编排方式,不仅适合打算认真学习C语言编程的学生阅读,也适合那些精通其他编程语言,但希望更好地掌握C语言这门核心语言的开发人员阅读。

  《C Primer Plus(第6版)中文版》在之前版本的基础之上进行了全新升级,它涵盖了C语言*新的进展以及C11标准的详细内容。本书还提供了大量深度与广度齐备的教学技术和工具,来提高你的学习。

  同样,如果你学习的是C++,则建议选择《C++primer plus第6版》。

  除了同《C Primer Plus第6版》一样具有全面细致的知识点讲解和有助于理解的代码示例以外,《C++Primer Plus第6版》针对C++初学者,从C语言基础知识开始介绍,然后在此基础上详细阐述C++新增的特性,因此不要求读者有C语言方面的背景知识。

  《C++Primer Plus第6版》全书共分18章,详细讲解了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系表达式、分支语句和逻辑运算符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出、C++11新增功能等内容。

免责声明:本文由用户上传,如有侵权请联系删除!