c与c++区别(c 与c的区别与联系)

频道:社会百科 日期: 浏览: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标准


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新增功能等内容。

关键词colorground